トップページ

テキストのパターンマッチング

はじめに

ワイルドカードおよび正規表現は文字列のパターンを指定する方法です。1パターンに文字列が一致することを「マッチする」といい、パターンを指定するための文字としてメタキャラクタ(すべて半角)が定義されています。正規表現は処理系によって記法がまちまちですが、ここではすべての処理系に共通する基本的な正規表現を紹介します。処理系ごとの違いについてはとほほの正規表現入門を参照してください。

ワイルドカード

ワイルドカードに使用するメタキャラクタは?(疑問符)と*(アスタリスク)です。

疑問符は任意の1文字にマッチします。

パターンfoo???はfoo123,fooabcなどの文字列にマッチします。

アスタリスクは任意の文字列にマッチします。

パターンfoo*barはfooで始まりbarで終わる文字列にマッチします。

正規表現

正規表現に使用するメタキャラクタは次のとおり。

$*+-.?[\]^{|}

これらのメタキャラクタはパターンの中で特別な意味を持ち他の文字とは区別されます。

メタキャラクタ以外の文字はその文字自身にマッチします。

パターンfooは文字列fooにマッチします。
パターンbarは文字列barにマッチします。

メタキャラクタを普通の文字として扱いたいときは直前に\(バックスラッシュ)をつけます。これを「エスケープする」といいます。

パターンfoo\\barは文字列foo\barにマッチします。
パターンfoo\*barは文字列foo*barにマッチします。

任意の1文字を表すには.(ピリオド)と[](角かっこ)を使用します。

ピリオドは改行を除く1文字にマッチします。

パターンfoo...barはfoofoobar,foobarbarなどの文字列にマッチします。

角かっこ内の文字列はその文字列の各文字にマッチします。

パターン[bar]はbarの各文字にマッチします。

角かっこ内に\(バックスラッシュ)を含める場合は\\としてエスケープします。

パターン[\\]は文字\にマッチします。

角かっこ内に](閉じる角かっこ)を含める場合は\]としてエスケープします。[(開く角かっこ)はそのままで問題ありません。

パターン[\]]は文字]にマッチします。
パターン[[]は文字[にマッチします。

角かっこ内の-(マイナス記号)は文字の範囲を指定するメタキャラクタになります。

パターン[0-9]は数字にマッチします。
パターン[a-z]は英小文字にマッチします。
パターン[-bar]は-barの各文字にマッチします。先頭のマイナス記号はメタキャラクタとして扱われません。
パターン[9-0]は無効な表現です。文字コードが左から右へ昇順になるように記述する必要があります。

角かっこ内の先頭の^(ハット記号)は否定を意味するメタキャラクタになります。

パターン[^bar]はbar以外の文字にマッチします。
パターン[^0-9]は数字以外の文字にマッチします。
パターン[bar^]はbar^の各文字にマッチします。先頭に位置しないハット記号はメタキャラクタとして扱われません。

角かっこ内ではバックスラッシュ、閉じる角かっこ、先頭に位置しないマイナス記号、先頭のハット記号がメタキャラクタとして扱われ、その他の文字はその文字自身を表します。

パターン[.*]は.*の各文字にマッチします。

パターンの連続を表すには*+?{}(アスタリスク、プラス記号、疑問符、波かっこ)を使用します。

アスタリスクは直前のパターンの0回以上の連続を表します。

パターンf*ooはoo,foo,ffoo,ffffooなどの文字列にマッチします。
パターンba*rはbr,bar,baar,baaaarなどの文字列にマッチします。

プラス記号は直前のパターンの1回以上の連続を表します。

パターンf+ooはfoo,ffoo,ffffooなどの文字列にマッチします。
パターンba+rはbar,baar,baaaarなどの文字列にマッチします。

疑問符は直前のパターンの0回以上1回以下の連続(直前のパターンの有無)を表します。

パターンf?ooはoo,fooの各文字列にマッチします。
パターンba?rはbr,barの各文字列にマッチします。

波かっこは直前のパターンの指定回数の連続を表します。

{3} 3回の連続
{3,} 3回以上の連続
{3,4} 3回以上4回以下の連続
パターンf{3}ooは文字列fffooにマッチします。
パターンf{2,3}ooはffoo,fffooの各文字列にマッチします。

アスタリスク、プラス記号、疑問符、波かっこの直前にパターンがない表現は無効です。

パターン*foo,+bar,?fooはすべて無効な表現です。

メタキャラクタとしてアスタリスクとプラス記号を含む表現は可能な限り長いパターンにマッチ(最長一致)します。可能な限り短いパターンにマッチ(最短一致)させるにはアスタリスクとプラス記号の直後に疑問符をつけます。

パターン.*barは文字列foobarfoobarに対して文字列foobarfoobarにマッチします。
パターン.*?barは文字列foobarfoobarに対して文字列foobarにマッチします。

位置を表すにはハット記号とドル記号を使用します。ハット記号は行頭にマッチします。ドル記号は行末にマッチします。

パターン^fooは行頭にある文字列fooにマッチします。
パターン^.*barは行頭からbarまでの文字列にマッチします。
パターンfoo$は行末にある文字列fooにマッチします。
パターン^bar$はbarという文字列のみが存在する行にマッチします。
パターン^^は行頭にある文字^にマッチします。行頭に位置しない^はメタキャラクタとして扱われません。
パターン$$は行末にある文字$にマッチします。行末に位置しない$はメタキャラクタとして扱われません。

複数のパターンを指定するには縦棒(パイプ)を使用します。

パターンfoo|barはfoo,barの各文字列にマッチします。
パターンfoo|bar|foobarはfoo,bar,foobarの各文字列にマッチします。
パターンf?oo|ba?rはoo,foo,br,barの各文字列にマッチします。

メタキャラクタの適用範囲を指定するには丸かっこを使用します。

パターン(foo)?barはbar,foobarの各文字列にマッチします。
パターン(foo)+barはfoobar,foofoobar,foofoofoobarなどの文字列にマッチします。
パターン(foo|bar)fooはfoofoo,barfooの各文字列にマッチします。

\1,\2,\3などはn番目の丸かっこで囲まれたパターンにマッチした文字列に置き換えられます。

パターン(foo)(bar)\2\1は文字列foobarbarfooにマッチします。

丸かっこで囲んだグループをキャプチャしてほしくない場合は開く丸かっこを(?:とします。

よく使用される慣用的な正規表現として以下のようなものがあります。

パターン.*は任意の文字列にマッチします。(ワイルドカードのアスタリスクと同じ意味になります)
パターン^$は空行にマッチします。
パターン^.*$は任意の1行にマッチします。

パターン[ -~]は制御文字を含まない表示可能な半角文字にマッチします。
パターン[\x00-\x7F]は制御文字を含む半角文字にマッチします。

パターン[。-゚]は半角カタカナにマッチします。

パターン[^\x00-\x7F]およびパターン[^ -~。-゚]は全角文字にマッチします。

パターン[A-Za-z0-9]は半角の英数字にマッチします。
パターン[!-/:-@[-`{-~]は半角の記号にマッチします。

パターン[A-Za-z0-9]は全角の英数字にマッチします。
パターン[!-~]は全角の記号にマッチします。

パターン[\u3040-\u309F]はひらがなにマッチします。
パターン[\u30A0-\u30FF]はカタカナ(全角)にマッチします。
パターン[\u4E00-\u9FFF]は漢字(CJK統合漢字ブロック)にマッチします。

パターン[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}はメールアドレスにマッチします。
パターンhttps?://[^\s/.?#].[^\s]*はURLにマッチします。
パターン(A-Za-z0-9?.)+[A-Za-z]{2,}はドメイン名にマッチします。
パターン<([A-Za-z][A-Za-z0-9-]*)\b[^>]*>(.*?)</\1>はHTMLの要素にマッチします。\1にタグ名\2に内部コンテンツがキャプチャされます。

  1. ワイルドカードと正規表現を混同した記述が多く見受けられますが惑わされないよう注意してください。両者は似て非なるものです。 ↩︎