7. 正規表現マッチングルール
7.1 基本的なパターンマッチング
すべては最も基本的なことから始まります。パターンは正規表現の最も基本的な要素であり、文字列の特性を記述する文字のセットです。パターンは、通常の文字列で構成される単純な場合もあれば、文字範囲、繰り返し、コンテキストを表すために特殊文字を使用する非常に複雑な場合もあります。例:
^once
このパターンには特殊文字 ^ が含まれています。これは、パターンが、once で始まる文字列にのみ一致することを意味します。たとえば、このパターンは文字列「onceUponatime」には一致しますが、「There Once was a man from NewYork」には一致しません。 ^ 記号が先頭を示すのと同様に、$ 記号は特定のパターンで終わる文字列と一致します。
bucket$
このパターンは、「誰がこの現金をすべてバケツに入れたか」には一致しますが、「バケツ」には一致しません。文字 ^ と $ を一緒に使用すると、完全一致を表します (文字列はパターンと同じです)。例:
^bucket$
文字列「bucket」のみに一致します。パターンに ^ と $ が含まれていない場合は、そのパターンを含む任意の文字列と一致します。例: パターン
once
は文字列
There become a man from NewYork
Who keep all of hisCash in a Bucket.
と一致します。
このパターンの文字(o-n-c-e)はリテラル文字、つまり文字そのものを表しており、数字も同様です。句読点や白文字 (スペース、タブなど) など、その他の少し複雑な文字にはエスケープ シーケンスが必要です。すべてのエスケープ シーケンスはバックスラッシュ () で始まります。タブ文字のエスケープ シーケンスは次のとおりです。したがって、文字列がタブ文字で始まるかどうかを検出したい場合は、次のパターンを使用できます:
^
同様に、次を使用します。
これは「改行」を意味し、改行を意味します。他の特殊記号は、前にバックスラッシュを付けて使用できます。たとえば、バックスラッシュ自体は . で表され、ピリオドは . で表されます。
7.2 文字クラスタ
インターネットプログラムでは、通常、ユーザー入力を検証するために正規表現が使用されます。ユーザーがフォームを送信するとき、入力された電話番号、住所、電子メール アドレス、クレジット カード番号などが有効かどうかを判断するには、通常のリテラル文字を使用するだけでは十分ではありません。
したがって、私たちが望むパターンを記述するために、より自由な方法、つまり文字クラスターを使用する必要があります。すべての母音文字を表すクラスターを作成するには、すべての母音文字を角かっこで囲みます:
[AaEeIiOoUu]
このパターンは任意の母音文字と一致しますが、表すことができるのは 1 つの文字のみです。次のような文字の範囲を表すにはハイフンを使用します:
[a-z] //すべての小文字と一致
[A-Z] //すべての大文字と一致
[a-zA-Z] //すべての文字と一致
[0- 9] //すべての数字と一致します
[0-9.-] //すべての数字、ピリオド、マイナス記号と一致します
[ f
] //すべての白い文字を一致させる
繰り返しになりますが、これらは 1 つの文字のみを表しており、これは非常に重要です。 「z2」、「t6」、または「g7」などの小文字と数字で構成される文字列と一致させたいが、「ab2」、「r2d3」、または「b52」とは一致させたくない場合は、次のパターンを使用します。
^[a-z][0-9]$
[a-z]は26文字の範囲を表しますが、ここでは最初の文字が小文字である文字列にのみ一致します。
^は文字列の先頭を表すと前述しましたが、別の意味もあります。 ^ が一連の角括弧内で使用される場合、それは「しない」または「除外する」を意味し、特定の文字を削除するためによく使用されます。前の例を使用すると、最初の文字を数字にすることはできません:
^[^0-9][0-9]$
このパターンは "&5"、"g7"、および "-2" に一致しますが、 「12」と「66」には一致しません。特定の文字を除外する例をいくつか示します:
[^a-z] //小文字を除くすべての文字
[^/^] //()(/)(^)を除くすべての文字
[^ "] //すべて二重引用符 (") と一重引用符 () を除く文字
特殊文字「.」(ドット、ピリオド) は、「改行」を除くすべての文字を表すために正規表現で使用されます。したがって、パターン「^.5$」は、数字の 5 で終わり、「改行」以外の他の文字で始まる任意の 2 文字の文字列と一致します。パターン「.」は、空の文字列と「改行」のみを含む文字列を除く、任意の文字列と一致します。
PHP 正規表現にはいくつかの組み込みのユニバーサル文字クラスターがあり、リストは次のとおりです:
文字クラスターの意味
[[:alpha:]] 任意の文字
[[:digit:]] 任意の数字
[[: alnum: ]] 任意の文字と数字
[[:space:]] 任意の白文字
[[:upper:]] 任意の大文字
[[: lower:]] 任意の小文字
[[:punct:]] 任意句読点
[[:xdigit:]] [0-9a-fA-F] に相当する任意の 16 進数
7.3 繰り返し出現するものを判断する
ここまでで、文字または数字を一致させる方法はすでにわかりましたが、さらに多くの場合、単語または数字のグループを一致させたい場合があります。単語は複数の文字で構成され、数字のグループは複数の単数で構成されます。文字または文字クラスターに続く中括弧 ({}) は、前のコンテンツが繰り返される回数を決定するために使用されます。
文字クラスターの意味
^[a-zA-Z_]$ すべての文字とアンダースコア
^[[:alpha:]]{3}$ すべての 3 文字の単語
^a$ 文字 a
^a{ 4}$ aaaa
^a{2,4}$ aa,aaa または aaaa
^a{1,3}$ a,aa または aaa
^a{2,}$ 2 つ以上の a を含む文字列
^a{2, } 例: aardvark と aaab、ただし apple ではない
a{2,} 例: baad と aaa、ただし Nantucket ではない
{2} 2 つのタブ文字
.{2} すべて 2 文字
これらの例は、3 つの異なる使用法を説明しています。中括弧の。数値 {x} は、「前の文字または文字クラスターが x 回のみ出現する」ことを意味し、数値とコンマ {x,} は、「前のコンテンツが x 回以上出現する」ことを意味します。 ,y} は、「前のコンテンツが少なくとも x 回表示されますが、y 回を超えない」ことを意味します。パターンをさらに多くの単語や数字に拡張できます:
^[a-zA-Z0-9_]{1,}$ //複数の文字、数字、またはアンダースコアを含むすべての文字列
^[0- 9]{1 ,}$ //すべての正の数
^-{0,1}[0-9]{1,}$ //すべての整数
^-{0,1}[0-9]{ 0,}.{0 ,1}[0-9]{0,}$ //すべて小数
最後の例はわかりにくいですよね。このように見てください。すべてがオプションの負符号 (-{0,1}) (^) で始まり、その後に 0 個以上の数字 ([0-9]{0,})、およびオプションの小数点 A が続きます。 (.{0,1}) の後に 0 個以上の数字 ([0-9]{0,}) が続き、それ以外は何もありません ($)。以下では、使用できるより簡単な方法について説明します。
特殊文字「?」は {0,1} に等しく、両方とも「0 または 1 つの前のコンテンツ」または「前のコンテンツはオプション」を表します。したがって、今の例は次のように簡略化できます:
^-?[0-9]{0,}.?[0-9]{0,}$
特殊文字 "*" は {0, }, これらはすべて「0 個以上の以前のコンテンツ」を表します。最後に、文字「+」は {1,} に等しく、これは「1 つ以上の前のコンテンツ」を意味するため、上記の 4 つの例は次のように書くことができます:
^[a-zA-Z0-9_]+$ / /複数の文字、数字、またはアンダースコアを含むすべての文字列
^[0-9]+$ //すべての正の数値
^-?[0-9]+$ //すべての整数
[0-9] *.?[0-9]*$ //すべて 10 進数
もちろん、これによって技術的に正規表現の複雑さが軽減されるわけではありませんが、正規表現が読みやすくなります