正規表現

正規表現は、クエリーエンティティパネルを含め、Data Workbench のあらゆる検索フィールドで使用されます。

正規表現について

正規表現は、パターンを検出したりテキストからサブ文字列を抽出したりするための、英数字や特殊文字(メタ文字)の組み合わせから成るテキストパターンです。正規表現は、コンピュータープログラミングにおいて広く使用されており、Perl をはじめとする各種言語において不可欠な存在となっています。

Data Workbench サーバーでは、いくつかの変換および条件の中で、複雑な文字列パターンを特定して抽出するために正規表現が使用されます。以降、正規表現について簡単に説明します。

この付録は、正規表現について詳細に解説したものではありません。詳しい解説については、オライリー・ジャパン発行の『詳説 正規表現 第 2 版』(Jeffrey E. F. Friedl 著)をお勧めします。

正規表現の用語

用語 定義
リテラル リテラルは、特定の文字の並びを探すために正規表現の中で使用する文字です。例えば、shop/products.html から product を検索する場合、product という文字列がリテラルです。つまり、文字列からの検索対象となる見たままの文字をいいます。
メタ文字 メタ文字は、正規表現のコンテキストの中で独特の解釈を持つ特殊文字です。例えば、ピリオド(.)は、任意の文字と一致するメタ文字です。
エスケープシーケンス エスケープシーケンスは単純に、特定のメタ文字をリテラルとして使用したい、という意図を正規表現エンジンに対して伝える手段です。エスケープシーケンスは常にバックスラッシュ (\) で始まります。 メタ文字の前にバックスラッシュ(バックスラッシュもメタ文字)が置かれている場合、正規表現エンジンは、そのエスケープされたメタ文字をリテラルとして解釈します。例えば、メタ文字のピリオド (.) と一致させるには、エスケープシーケンスを使用する必要があります。 ただし、168.196.0.11 という文字列のいずれかのピリオドと一致させるには、バックスラッシュとピリオド (\.) で構成される正規表現を使用します。
パターン 正規表現の別称です。基本的に正規表現は、ターゲット文字列と突き合わせようとするパターンであるといえます。
ターゲット文字列 目的のパターンの検索先となる文字列をいいます。

リテラルマッチングについて

エスケープ文字を一切含まないリテラル文字列を受け取って、それと一致する部分がターゲット文字列内に存在するかどうかを調べるのがリテラルマッチングです。

次の例で、リテラルマッチングの動作を説明します。Web サイトトラフィックから収集したデータがあって、cs(referrer) フィールドに次の値が含まれているとします。

https://www.abc.com/adventurenews/today.html?ad=123AZ45

リファラーが、いずれかの広告をクリックした人であるかどうかを判別するには、リファラーに ad という文字列が含まれているかどうかを調べる必要があります。サイトへのトラフィックのルーティングに広告が寄与したかどうかは、単純にリテラル文字列である ad をターゲット文字列から探すことで判断することもできます。この場合、確かにターゲット文字列に一致しますが、一致箇所が 2 つあって曖昧なために、誤判定につながるおそれがあります。

次の URL には、ad という文字列が 2 箇所に出現しています。

https://www.abc.com/ad vertnews/today.html?ad =123AZ45

そのため、特定の広告キャンペーンの結果として開始されたセッションを特定しようとする場合、リテラル ad を正規表現に使用しただけでは明らかに不十分です。この場合、リテラルを「ad=」に変更すると、曖昧さがなくなって、一致箇所が 1 つに絞り込まれます。しかしそれでも、広告キャンペーンが寄与したリファラーのみを確実に検出するうえでは十分とはいえません。次のようなリファラーがあるとします。

https://www.xyz.com/hello.html?pad=something

他人がサイトへのリンクを作成する際にどのような URL を使用するかをコントロールすることはできません。広告キャンペーンの結果として開始されたセッションを特定する手段として、リテラルマッチングは決して高度なメカニズムとはいえません。次の節では、より柔軟で強力なマッチングをメタ文字を使用して実現する方法について説明します。

メタ文字の使用

メタ文字は、プログラムまたはデータフィールドの中で、他の文字に関する情報を与える特殊文字です。

メタ文字 description
。(ドット) 1 文字に一致します。例えば、re:x.z は「xyz」や「xxz」に一致します。
*(星印) 1 つ以上の文字に一致します。例:re:Z* は「ZZZ」に一致します。
? (ワイルドカード) 直前の式と最小のマッチングで 0 回または 1 回一致します。例えば、xy?z は「xy」と「xyz」に一致します。

広く使用されている正規表現は他にもあり、それらを駆使してもっと複雑な検索文字列を指定することもできます。

リスト、範囲、論理和

リテラルマッチングで検索できるのが単一の文字列であるのに対し、ブラケット、ダッシュ、パイプを使用すると、ターゲット文字列内から検索する一連の文字を定義できます。

使用するメタ文字 正規表現プロセッサーが行う処理
ブラケット([ ]) 特定の文字位置でブラケット内の任意の文字と一致します。例えば、[AB] はアルファベットの A または B と、[0123456789] は 0 ~ 9 の範囲の任意の 1 文字と一致します。
ダッシュ(-)

文字の範囲と一致します。つまり、[0123456789] は、よりシンプルに [0-9] と記述することもできます。

文字の範囲や、その複数の範囲の組み合わせを 1 組のブラケットで指定することができます。例えば、[0-9A-C] は、0 ~ 9 および A ~ C の文字と一致します。

注意:ダッシュ(-)をリテラルとして検索するには、ブラケット内の先頭か末尾に記述する必要があります。例えば、[-0-9] とした場合、- および 0 ~ 9 が検索されます。

パイプ (|) 2 つの選択肢のうち一方を特定のターゲット文字列と突き合わせます。例えば、b|nat は、bat または nat と一致します。

次の例をご覧ください。

パターン 文字列 次に一致
Win9[58] OS=Win95 Win95
Win95 8 OS=Win98
[0-9] Mozilla/3.0 3
レッスン [A-Z] Lesson a 大文字の A ~ Z の範囲には小文字の a が含まれないので、一致は検出されません。

否定

否定は、指定された文字を除く任意の文字と一致させたいときに使用します。否定のメタ文字 ( サーカムフレックスまたはキャレット (^)) は、ブラケット内の最初の文字として使用され、ブラケット内の残りの文字以外が一致するようにします。 例えば、セミコロン (;) 以外の任意の文字を一致させるには、次のように記述します。

[^;]

この場合、セミコロンを除く任意の文字と一致します。

位置

ターゲット文字列の先頭または末尾と一致させるには、2 つのメタ文字のいずれかを使用します。

使用するメタ文字 正規表現プロセッサーが行う処理
キャレット (^) 文字列の先頭と一致します。例えば、^[Tt]he はターゲット文字列「The Beginning」に一致しますが、「This is the beginning」には一致しません。
ドル記号 ($) 文字列の末尾と一致します。例えば、[Ee]nd$は「This is the end」に一致しますが、「The end is a special time」には一致しません。
メモ

正規表現の先頭に^、末尾に$が含まれている場合、ターゲット文字列全体が正規表現と一致する必要があります。

任意の文字との一致

ピリオド(.)は、ターゲット文字列内の任意の文字と一致する特殊なメタ文字です。例えば、正規表現 ^…$ は、長さが 3 文字のターゲット文字列に一致します。 正規表現「…」は、3 文字以上の任意のターゲット文字列と一致します。

繰り返しのパターン

特定のパターンが複数回出現している箇所は、繰り返しを表すメタ文字で検出することができます。

使用するメタ文字 正規表現プロセッサーが行う処理
疑問符(?) メタ文字(?)の直前の文字が 0 回または 1 回出現している箇所と一致します。例えば、rea?d というパターンは、red や read と一致します。
アスタリスク(*) メタ文字(*)の直前の文字の 0 回以上の繰り返しと一致します。例えば、[0-9]* というパターンは、0 ~ 9(任意の整数)の任意の数の文字と一致します。
Plus (+) 直前の文字または範囲の 1 回以上の繰り返しと一致します。例えば、thre+ というパターンは、three とは一致しますが、through とは一致しません。
{n}

直前の文字または範囲の、ちょうど n 回の繰り返しと一致します。次のパターンは、米国の電話番号と一致します。[0-9]{3}-[0-9]{3}-[0-9]{4}.

最適なパターンではありませんが、ターゲット文字列が適切な形式になっているかどうかは、これで判別できます。

{n,m} 直前の文字の n 回以上、m 回以下の繰り返しと一致します。例えば、fo{1,2}d は、fod や food とは一致しますが、foood とは一致しません。

パターン抽出

パターンマッチングは、正規表現が備えている機能の一面に過ぎません。正規表現には、ターゲット文字列から重要な要素を抽出するメカニズムも備わっています。抽出には、開始丸括弧と終了丸括弧が使用されます。抽出結果は通常、別の処理への入力として渡し、%position% を使用してアクセスします(position は 1 組の丸括弧の個数を表す整数)。

パターン抽出の例を次に示します。

パターン 文字列 次に一致 抽出
Win(9[58]) OS=Win95 Win95 %1% = 95
(Win)(95|8) OS=Win98 Win98

%1% = Win

%2% = 98

Mozilla/([0-9]).([0-9]) Mozilla/3.0 Mozilla/3.03

%1% = 3

%2% = 0

Lesson([A-Z]) レッスン a 大文字の A ~ Z の範囲には小文字の a が含まれないので、一致は検出されません。

このページ