PHPレギュラー

WBOY
リリース: 2016-06-23 14:35:51
オリジナル
892 人が閲覧しました

正規表現 (正規表現) は、文字列に特定の部分文字列が含まれているかどうかを確認したり、一致した部分文字列を置換したり、特定の条件を満たす文字列から部分文字列を抽出したりするために使用できる文字列の一致パターンを記述します。

ディレクトリをリストする場合、dir *.txt または ls *.txt 内の *.txt は正規表現ではありません。これは、ここでの * の意味が正規表現の * とは異なるためです。

正規表現は、通常の文字(文字 a ~ z など)と特殊文字(メタキャラクターと呼ばれます)で構成されるテキスト パターンです。正規表現は、文字パターンと検索文字列を照合するテンプレートとして機能します。

3.1 通常の文字

は、メタキャラクターとして明示的に指定されていないすべての印刷文字と非印刷文字で構成されます。これには、すべての大文字と小文字のアルファベット、すべての数字、すべての句読点、および一部の記号が含まれます。

3.2 非印刷文字

文字の意味
cx x で指定された制御文字と一致します。たとえば、cM は Control-M または復帰文字と一致します。 x の値は、A ~ Z または a ~ z のいずれかでなければなりません。それ以外の場合、c はリテラルの「c」文字として扱われます。
f フォーム フィードと一致します。 x0c および cL に相当します。
n 改行文字と一致します。 x0a および cJ に相当します。
r 復帰文字と一致します。 x0d および cM に相当します。
s スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 【fnrtv】に相当。
S 空白以外の文字と一致します。 [^ fnrtv] に相当します。
t はタブ文字と一致します。 x09 および cI に相当します。
v 垂直タブ文字と一致します。 x0b および cK に相当します。


3.3 特殊文字

いわゆる特殊文字とは、特別な意味を持つ一部の文字のことで、上記の「*.txt」の * のように、単に任意の文字列の意味を意味します。ファイル名に * が含まれるファイルを検索する場合は、* をエスケープする、つまり * の前に 1 を追加する必要があります。 ls*.txt。正規表現には次の特殊文字があります。

特殊文字 説明 {

正規表現の構築方法は、数式の作成方法と同じです。つまり、さまざまなメタ文字と演算子を使用して小さな式を結合し、より大きな式を作成します。正規表現のコンポーネントは、単一の文字、文字のコレクション、文字の範囲、文字間の選択、またはこれらすべてのコンポーネントの任意の組み合わせにすることができます。


3.4 修飾子

修飾子は、一致を満たすために正規表現の特定のコンポーネントが何回出現する必要があるかを指定するために使用されます。 * または + または ? または {n} または {n,} または {n,m} の 6 種類があります。

*、+、および ? 修飾子はすべて、できるだけ多くのリテラルと一致するため、それらの後に ? を追加するだけで非貪欲または最小限の一致が実現されます。

正規表現の修飾子は次のとおりです:

$ 入力文字列の終了位置と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は 'n' または 'r' にも一致します。 $ 文字そのものと一致させるには、$ を使用します。
( ) 部分式の開始と終了をマークします。部分式は後で使用するために取得できます。これらの文字と一致させるには、( と ) を使用します。
* 直前の部分式と 0 回以上一致します。 * 文字と一致させるには、* を使用します。
+ 前の部分式と 1 回以上一致します。 + 文字と一致させるには、+ を使用します。
. 改行文字 n を除く任意の 1 文字と一致します。 . と一致させるには、 を使用します。
[ は角括弧式の始まりを示します。 [ と一致させるには、[ を使用します。
? 先行する部分式と 0 回または 1 回一致するか、非貪​​欲修飾子を指定します。 ? 文字に一致させるには、? を使用します。
次の文字を特殊文字、リテラル文字、後方参照、または 8 進エスケープ文字としてマークします。たとえば、「n」は文字「n」と一致します。 「n」は改行文字と一致します。シーケンス '\' は "" に一致し、'(' は "(" に一致します。
^ は、角括弧式で使用されない限り、入力文字列の先頭に一致します。この場合、文字が受け入れられないコレクション。^ 文字自体を一致させるには、
を使用して修飾子式の開始をマークします。 |、使用します
文字 説明
* 前の部分式と 0 回以上一致します。たとえば、zo* は「z」と「zoo」に一致します。 * {0,} に相当します。
+ 前の部分式と 1 回以上一致します。たとえば、「zo+」は「zo」と「zoo」には一致しますが、「z」には一致しません。 + は {1,} と同等です。
? 先行する部分式と 0 回または 1 回一致します。たとえば、「do(es)?」は「do」または「does」の「do」と一致します。 ? {0,1} に相当します。
{n} n は負でない整数です。特定の回数 n 回一致します。たとえば、「o{2}」は「Bob」の「o」と一致できませんが、「food」の 2 つの o と一致します。
{n,} n は負でない整数です。少なくとも n 回一致します。たとえば、「o{2,}」は「Bob」の「o」とは一致しませんが、「foooood」のすべての「o」と一致します。 「o{1,}」は「o+」と同等です。 「o{0,}」は「o*」と同等です。
{n,m} m と n は両方とも非負の整数であり、n


3.5 ロケーター

文字列または単語の境界を記述するために使用されます。^ と $ はそれぞれ文字列の先頭と末尾を指し、b は単語の前または後ろの境界を示し、Bは非単語境界を表します。修飾子はロケーターでは使用できません。

3.6

を選択

すべての選択項目を括弧で囲み、隣接する選択項目を | で区切ります。ただし、括弧を使用すると、関連する一致がキャッシュされるという副作用が生じます。この場合、最初のオプションの前に ?: を使用すると、この副作用を排除できます。

このうち、?: は非キャプチャ要素の 1 つで、他の 2 つの非キャプチャ要素は ?= と ?! です。この 2 つはより意味を持ち、括弧内の任意の開始と一致します。正規表現パターンは、正規表現パターンに一致しない任意の位置の検索文字列に一致します。後者は、正規表現パターンに一致しない任意の最初の位置にある検索文字列に一致します。

3.7 後方参照

正規表現パターンまたはパターンの一部を括弧で囲むと、関連付けられた一致が一時バッファに保存され、キャプチャされた各サブマッチが正規表現パターンの左から右にキャプチャされます。コンテンツが保存されます。部分一致が格納されるバッファには、1 から始まり、最大 99 個の部分式まで連続した番号が付けられます。各バッファーには、「n」を使用してアクセスできます。n は、特定のバッファーを識別する 1 桁または 2 桁の 10 進数です。

非キャプチャメタ文字「?:」、「?=」、または「?!」を使用して、関連する一致の保持を無視できます。

4. 各種演算子の操作優先度

同じ優先度の操作は左から右へ、異なる優先度の操作は高い順に実行されます。さまざまな演算子の優先順位は高い順に次のとおりです。

演算子の説明
エスケープ文字
()、(?:)、(?=)、[] 丸めおよび角括弧
*、+、?、{n}、{n,}、{n,m} 修飾子
^、$、anymetacharacter 位置と順序
| 「OR」演算

5. すべての記号の説明

文字の説明 の後の 'r ' は、RegExp オブジェクトの Multiline プロパティが設定されている場合、入力文字列の末尾と一致します。 $ は、 'n' または 'r' の前の位置にも一致します * 先行する部分式 0 と一致しますたとえば、zo* は「z」および「zoo」に一致します。 * は、前の部分式に 1 回または複数回一致します。たとえば、「zo+」は、「zo」に一致します。 + は、{1,} と同等です。 ? は、前の部分式に 0 回または 1 回一致します。たとえば、「do(es)?」は、「do」または「does」の「do」に一致します。 " ? は {0,1} と同等です。{n}{n,}n は負ではない整数です。少なくとも n 回一致します。たとえば、「o{2,}」は「o」と一致できません「Bob」では「o{1,}」と一致しますが、「o+」は「o*」と同等です。 m}m と n は両方とも非負の整数であり、n . 「n」を除く任意の 1 文字と一致します。 「n」を含む任意の文字と一致するには、「[.n]」のようなパターンを使用します。 (パターン) パターンを一致させて、この一致を取得します。取得された一致は、VBScript の SubMatches コレクションまたは JScript の $0 ~ $9 プロパティを使用して、生成された Matches コレクションから取得できます。括弧文字と一致させるには、「(」または「)」を使用します。 (?:pattern) パターンに一致しますが、一致結果が得られません。これは、一致が得られず、後で使用するために保存されないことを意味します。これは、「または」文字 (|) を使用してパターンの一部を結合する場合に便利です。たとえば、「industr(?:y|ies)」は「industry|industries」より短い式です。 (?=pattern) 前方参照。文字列一致パターンの先頭にある検索文字列と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「Windows (?=95|98|NT|2000)」は、「Windows 2000」の「Windows」には一致しますが、「Windows 3.1」の「Windows」には一致しません。プリフェッチでは文字は消費されません。つまり、一致が発生した後、次の一致の検索は、プリフェッチを含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。 (?!pattern) 否定検索。パターンに一致しない文字列の先頭にある検索文字列と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「Windows (?!95|98|NT|2000)」は、「Windows 3.1」の「Windows」と一致しますが、「Windows 2000」の「Windows」とは一致しません。プリフェッチは文字を消費しません。つまり、一致が発生した後、次の一致の検索は、プリフェッチ x|ymatch x または y を含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。たとえば、「z|food」は「z」または「food」と一致します。 '(z|f)ood' は、「zood」または「food」と一致します。
次の文字を特殊文字、リテラル文字、後方参照、または 8 進エスケープ文字としてマークします。たとえば、「n」は文字「n」と一致します。 「n」は改行文字に一致します。シーケンス '\' は "" に一致し、"(" は "(" に一致します。
^ は入力文字列の先頭に一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、 ^ は 'n' にも一致します。
n は非負の整数です。特定の回数一致します。たとえば、'o{2}' は " Bob" ですが、"food" の 2 つの o と一致します。
[xyz] キャラクターコレクション。含まれている文字のいずれかと一致します。たとえば、「[abc]」は「plain」の「a」と一致します。
[^xyz] 負の値の文字のセット。含まれていない任意の文字と一致します。たとえば、「[^abc]」は「plain」の「p」と一致します。
[a-z] 文字範囲。指定された範囲内の任意の文字と一致します。たとえば、「[a-z]」は、「a」から「z」の範囲内の任意の小文字の英字と一致します。
[^a-z] 否定文字の範囲。指定された範囲内にない任意の文字と一致します。たとえば、「[^a-z]」は、「a」から「z」の範囲にない任意の文字と一致します。
b 単語とスペースの間の位置を指す単語境界に一致します。たとえば、「erb」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。
B 単語以外の境界と一致します。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。
cx x で指定された制御文字と一致します。たとえば、cM は Control-M または復帰文字と一致します。 x の値は、A ~ Z または a ~ z のいずれかでなければなりません。それ以外の場合、c はリテラルの「c」文字として扱われます。
d 数字と一致します。 [0-9]に相当します。
D 数字以外の文字と一致します。 [^0-9] と同等。
f フォーム フィードと一致します。 x0c および cL に相当します。
n 改行文字と一致します。 x0a および cJ に相当します。
r 復帰文字と一致します。 x0d および cM に相当します。
s スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 【fnrtv】に相当。
S 空白以外の文字と一致します。 [^ fnrtv] に相当します。
t はタブ文字と一致します。 x09 および cI に相当します。
v 垂直タブ文字と一致します。 x0b および cK に相当します。
w アンダースコアを含む任意の単語文字と一致します。 「[A-Za-z0-9_]」と同等。
W 単語以外の文字と一致します。 「[^A-Za-z0-9_]」と同等。
xn n と一致します。n は 16 進数のエスケープ値です。 16 進数のエスケープ値は、正確に 2 桁の長さである必要があります。たとえば、「x41」は「A」と一致します。 「x041」は「x04」および「1」と同等です。 ASCII エンコーディングは正規表現で使用できます。 .
num num と一致します。ここで、num は正の整数です。取得した一致への参照。たとえば、「(.)1」は、連続する 2 つの同一の文字に一致します。
n 8 進エスケープ値または後方参照を識別します。 n の前に少なくとも n 個のフェッチされた部分式がある場合、n は後方参照になります。それ以外の場合、n が 8 進数 (0 ~ 7) の場合、n は 8 進数のエスケープ値になります。
nm 8 進エスケープ値または後方参照を識別します。 nm の前に少なくとも nm 個の取得可能な部分式がある場合、nm は後方参照になります。 nm の前に少なくとも n が取得されている場合、n は後方参照であり、その後にリテラル m が続きます。前述の条件がいずれも当てはまらない場合、n と m が両方とも 8 進数 (0 ~ 7) である場合、nm は 8 進数のエスケープ値 nm と一致します。
nml n が 8 進数 (0 ~ 3) で、m と l が両方とも 8 進数 (0 ~ 7) である場合、8 進数のエスケープ値 nml と一致します。
un は n と一致します。n は 4 桁の 16 進数で表される Unicode 文字です。たとえば、u00A9 は著作権記号 (?) に一致します。


6. いくつかの例

正規表現の説明/ (w+):/ /([^/:]+)(:d*)?([^# ]*)/ URL をプロトコル、ドメイン、ポート、および相対パスに解決します/^(?:Chapter|Section ) [1-9][0-9]{0,1}$/章の位置を特定します/[-a-z]/A から z、合計 26 文字と - 記号。 /terb//Bapt//Windows(?=95 |98 |NT )/ の後ろから次のものを起動します。

7. 正規表現のマッチングルール

7.1 基本的なパターンマッチング

すべては最も基本的なものから始まります。パターンは正規表現の最も基本的な要素であり、文字列の特性を記述する文字のセットです。パターンは、通常の文字列で構成される単純な場合もあれば、文字範囲、繰り返し、コンテキストを表すために特殊文字を使用する非常に複雑な場合もあります。例:

^once

このパターンには特殊文字 ^ が含まれており、このパターンは、once で始まる文字列のみと一致することを意味します。たとえば、このパターンは文字列「onceUponatime」には一致しますが、「There Once was a man from NewYork」には一致しません。 ^ 記号が先頭を示すのと同様に、$ 記号は、特定のパターンで終わる文字列と一致するために使用されます。

bucket$

このパターンは、「誰がこの現金をすべてバケツに入れたか」には一致しますが、「バケツ」には一致しません。文字 ^ と $ を一緒に使用すると、完全一致を表します (文字列はパターンと同じです)。例:

^bucket$

文字列「bucket」のみに一致します。パターンに ^ と $ が含まれていない場合は、そのパターンを含む任意の文字列と一致します。例: パターン

once

は、文字列

There Once was a man from NewYork
Who keep all of hisCash in a Bucket.

と一致します。

このパターンの文字(o-n-c-e)はリテラル文字、つまり文字そのものを表しており、数字も同様です。句読点や白文字 (スペース、タブなど) など、その他の少し複雑な文字にはエスケープ シーケンスが必要です。すべてのエスケープ シーケンスはバックスラッシュ () で始まります。タブ文字のエスケープ シーケンスは次のとおりです。したがって、文字列がタブ文字で始まるかどうかを検出したい場合は、次のパターンを使用できます:

^t

同様に、「改行」を表すには n を使用し、復帰を表すには r を使用します。他の特殊記号は、前にバックスラッシュを付けて使用できます。たとえば、バックスラッシュ自体は \ で表され、ピリオドは . で表されます。

7.2 文字クラスタ

インターネット プログラムでは、通常、ユーザー入力を検証するために正規表現が使用されます。ユーザーがフォームを送信するとき、入力された電話番号、住所、電子メール アドレス、クレジット カード番号などが有効かどうかを判断するには、通常のリテラル文字を使用するだけでは十分ではありません。

したがって、私たちが望むパターンを記述するために、より自由な方法、つまり文字クラスターを使用する必要があります。すべての母音文字を表すクラスターを作成するには、すべての母音文字を角かっこで囲みます。

[AaEeIiOoUu]

このパターンは任意の母音文字と一致しますが、表すことができるのは 1 つの文字のみです。次のような文字の範囲を表すにはハイフンを使用します:

[a-z] //すべての小文字と一致
[A-Z] //すべての大文字と一致
[a-zA-Z] //すべての文字と一致
[0 -9] // すべての数字と一致します
[0-9.-] // すべての数字、ピリオド、マイナス記号と一致します
[ frtn] // すべての白い文字と一致します

同様に、これらは非常に重要な文字のみを表します。 「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 ではない
t{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,}$ //すべて 10 進数

最後の例はわかりにくいですよね。このように見てください。すべてがオプションの負符号 (-{0,1}) (^) で始まり、その後に 0 個以上の数字 ([0-9]{0,})、およびオプションの小数点 A が続きます。 (.{0,1}) の後に 0 個以上の数字 ([0-9]{0,}) が続き、それ以外は何もありません ($)。以下では、使用できるより簡単な方法について説明します。

特殊文字「?」は {0,1} に等しく、両方とも「0 または 1 つの前のコンテンツ」または「前のコンテンツはオプション」を表します。したがって、今の例は次のように簡略化できます:

/b([a-z]+) 1b/gi 単語が連続して現れる位置
Chapter には一致しますが、terminal には一致しません
Chapter には一致しますが、aptitude には一致しません
Windows95、Windows98、または WindowsNT と一致する場合は、Windows
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート