3

Accessのクエリとフィルターの基準についてはよく知っていますが、同様のステートメントを正規表現パターンとして表現する方法がわかりません。誰かが私が理解しているいくつかの簡単な例にそれらを関連付けるのを手伝ってくれるかどうか疑問に思っています。

Accessなどのフィールドに一致する正規表現を使用している場合、次のステートメントをどのように表現しますか?例は、このAccess Query and FilterCriteriaWebページにあるものと似ています。Accessと同様に、大文字と小文字は区別されません。

  1. 「ロンドン」

    Londonという単語と完全に一致する文字列。

  2. 「ロンドン」または「パリ」

    LondonまたはParisのいずれかの単語に完全に一致する文字列。

  3. 「ロンドン」ではない

    ロンドン以外の文字列。

  4. 「S*」のように

    文字sで始まる任意の文字列。

  5. 「*st」のように

    stの文字で終わる文字列。

  6. 「*the*dog*」のように

    「the」および「dog」という単語を含み、前、間、または最後に任意の文字が含まれる文字列。

  7. 「[AD]*」のように

    AからDの文字で始まり、その後に続く文字列。

  8. 「*ロンドン*」は好きではありません

    Londonという単語がどこにも含まれていない文字列。

  9. 「L*」は好きじゃない

    Lで始まらない文字列。

  10. 「L*」のように「ロンドン*」のように

    文字Lで始まり、Londonという単語ではない文字列。

4

3 に答える 3

15

正規表現は、Access SQL で条件を作成するために使用されてきたどのパターンよりも強力です。これらのタイプのパターンに限定すると、正規表現の非常に興味深い機能のほとんどを見逃してしまいます。

たとえば、日付や IP アドレスの抽出、単純な電子メールまたは URL の検出または検証、基本的な参照コードの検証などを検索することはできません (たとえば、注文参照コードが義務付けられたコーディング構造に従っているかどうかを尋ねるなどPO123/C456)。など

@Smandoli が言及したように、パターン マッチングに関する先入観を忘れて、正規表現言語に飛び込むことをお勧めします。

Mastering Regular Expressionsという本は非常に貴重であることがわかりましたが、正規表現パターンを自由に試すにはツールが最適です。私はRegexBuddyを使用していますが、他のツールも利用できます

基本試合

ここで、リストに関して、かなり標準化された正規表現構文を使用します。

  1. 「ロンドン」

    London という単語に完全に一致する文字列。

    ^London$

  2. 「ロンドン」または「パリ」

    London または Paris のいずれかの単語に正確に一致する文字列。

    ^(London|Paris)$

  3. 「ロンドン」ではありません

    ロンドン以外の任意の文字列。

    結果を照合し^London$て反転します ( NOT)

  4. 「S*」のように

    文字 s で始まる任意の文字列。

    ^s

  5. 「*st」のように

    文字 st で終わる任意の文字列。

    st$

  6. 「*the*dog*」のように

    'the' および 'dog' という単語を含み、その前、間、または最後に任意の文字がある文字列。

    the.*dog

  7. 「[AD]*」のように

    A から D までの文字で始まり、その他の文字が続く任意の文字列。

    ^[A-D]

  8. 「*ロンドン*」とは違う

    London という単語をどこにも含まない文字列。

    の一致結果を逆にしLondonます ( : のような否定先読み
    ^(.(?!London))*$を使用できますが、Access で使用できるより基本的な正規表現エンジンでは使用できないと思います)。

  9. 「L*」とは違う

    L で始まらない文字列。

    ^[^L]上記で見たように、単一文字の否定一致は、単語全体の否定一致よりも簡単です。

  10. 「L*」のようで「London*」のようではない

    文字 L で始まり、London という単語ではない文字列。

    ^L(?!ondon).*$

SQL 基準での正規表現の使用

Access では、SQL クエリで直接使用できるユーザー定義関数を簡単に作成できます。
クエリで正規表現マッチングを使用するには、次の関数をモジュールに配置します。

' ----------------------------------------------------------------------'
' Return True if the given string value matches the given Regex pattern '
' ----------------------------------------------------------------------'
Public Function RegexMatch(value As Variant, pattern As String) As Boolean
    If IsNull(value) Then Exit Function
    ' Using a static, we avoid re-creating the same regex object for every call '
    Static regex As Object
    ' Initialise the Regex object '
    If regex Is Nothing Then
        Set regex = CreateObject("vbscript.regexp")
        With regex
            .Global = True
            .IgnoreCase = True
            .MultiLine = True
        End With
    End If
    ' Update the regex pattern if it has changed since last time we were called '
    If regex.pattern <> pattern Then regex.pattern = pattern
    ' Test the value against the pattern '
    RegexMatch = regex.test(value)
End Function

次に、クエリ基準で使用できます。たとえば、PartTablescrew 18mmテーブルで、 likePan Head Screw length 18 mmまたは evenSCREW18mmなどのバリエーションに一致するすべてのパーツを検索できます。

SELECT PartNumber, Description
FROM   PartTable
WHERE  RegexMatch(Description, "screw.*?d+\s*mm")

警告

  • 正規表現マッチングは古いスクリプト ライブラリを使用するため、正規表現言語のフレーバーは、他のプログラミング言語で利用可能な .Net で見られるものよりも少し制限されています。
    JavaScript で使用されるものと多かれ少なかれ同じであるため、それでもかなり強力です。VBScript 正規表現エンジン
    について読んで、できることとできないことを確認してください。

  • さらに悪いことに、このライブラリを使用した正規表現のマッチングはかなり遅く、使いすぎないように注意する必要があります。

とは言っても、時には非常に役立つこともあります。たとえば、正規表現を使用して、ユーザーからのデータ入力をサニタイズし、正規化する必要がある同様のパターンを持つエントリを検出しました。
正規表現をうまく使用すると、データの一貫性を高めることができますが、慎重に使用してください。

于 2012-05-01T08:37:30.957 に答える
3

正規表現は、最初に侵入するのが困難です。正直なところ、スプーンで与えられた例を探すことは、「手を汚す」ほどには役に立ちません。また、MS Access は良い出発点ではありません。正規表現は、SQL クエリ プロセスとうまく「認識」しません。アプリケーションでも、精神的な方向性でもありません。必要なのは、テキスト エディターを使用して処理するテキスト ファイルです。

于 2012-05-01T03:31:36.147 に答える