正規表現は、Access SQL で条件を作成するために使用されてきたどのパターンよりも強力です。これらのタイプのパターンに限定すると、正規表現の非常に興味深い機能のほとんどを見逃してしまいます。
たとえば、日付や IP アドレスの抽出、単純な電子メールまたは URL の検出または検証、基本的な参照コードの検証などを検索することはできません (たとえば、注文参照コードが義務付けられたコーディング構造に従っているかどうかを尋ねるなどPO123/C456
)。など
@Smandoli が言及したように、パターン マッチングに関する先入観を忘れて、正規表現言語に飛び込むことをお勧めします。
Mastering Regular Expressionsという本は非常に貴重であることがわかりましたが、正規表現パターンを自由に試すにはツールが最適です。私はRegexBuddyを使用していますが、他のツールも利用できます。
基本試合
ここで、リストに関して、かなり標準化された正規表現構文を使用します。
「ロンドン」
London という単語に完全に一致する文字列。
^London$
「ロンドン」または「パリ」
London または Paris のいずれかの単語に正確に一致する文字列。
^(London|Paris)$
「ロンドン」ではありません
ロンドン以外の任意の文字列。
結果を照合し^London$
て反転します ( NOT
)
「S*」のように
文字 s で始まる任意の文字列。
^s
「*st」のように
文字 st で終わる任意の文字列。
st$
「*the*dog*」のように
'the' および 'dog' という単語を含み、その前、間、または最後に任意の文字がある文字列。
the.*dog
「[AD]*」のように
A から D までの文字で始まり、その他の文字が続く任意の文字列。
^[A-D]
「*ロンドン*」とは違う
London という単語をどこにも含まない文字列。
の一致結果を逆にしLondon
ます ( : のような否定先読み
^(.(?!London))*$
を使用できますが、Access で使用できるより基本的な正規表現エンジンでは使用できないと思います)。
「L*」とは違う
L で始まらない文字列。
^[^L]
上記で見たように、単一文字の否定一致は、単語全体の否定一致よりも簡単です。
「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 正規表現エンジン
について読んで、できることとできないことを確認してください。
さらに悪いことに、このライブラリを使用した正規表現のマッチングはかなり遅く、使いすぎないように注意する必要があります。
とは言っても、時には非常に役立つこともあります。たとえば、正規表現を使用して、ユーザーからのデータ入力をサニタイズし、正規化する必要がある同様のパターンを持つエントリを検出しました。
正規表現をうまく使用すると、データの一貫性を高めることができますが、慎重に使用してください。