PHP正規表現
正規表現 - 文法
正規表現 (正規表現) は、文字列に特定の部分文字列が含まれているかどうかを確認し、一致する部分文字列を置換するか、一致する部分文字列を抽出するために使用できる文字列一致パターンを記述します。特定の文字列から特定の条件を取得するなど。
ディレクトリをリストする場合、dir *.txt または ls *.txt 内の *.txt は正規表現ではありません。これは、ここでの * の意味が正規表現の * とは異なるためです。
正規表現の構築は、数式の作成と同じです。つまり、さまざまなメタ文字や演算子を使用して、小さな式を組み合わせて、より大きな式を作成できます。正規表現のコンポーネントは、単一の文字、文字のコレクション、文字の範囲、文字間の選択、またはこれらすべてのコンポーネントの任意の組み合わせにすることができます。
正規表現は、通常の文字 (文字 a ~ z など) と特殊文字 (「メタ文字」と呼ばれる) で構成されるテキスト パターンです。パターンは、テキストを検索するときに一致する 1 つ以上の文字列を記述します。正規表現は、文字パターンと検索文字列を照合するテンプレートとして機能します。
通常の文字
通常の文字には、メタキャラクターとして明示的に指定されていないすべての印刷可能文字と印刷不可能な文字が含まれます。これには、すべての大文字と小文字、すべての数字、すべての句読点、およびその他の記号が含まれます。
非印刷文字
非印刷文字も正規表現の一部にすることができます。次の表は、非印刷文字を表すエスケープ シーケンスの一覧です。
特殊文字
いわゆる特殊文字は、上記の「*.txt」内の文字など、特別な意味を持つ文字です。 * は、単に任意の文字列の意味を意味します。ファイル名に * が含まれるファイルを検索する場合は、* をエスケープする、つまり * の前に 1 を追加する必要があります。 ls *.txt。
多くのメタキャラクターは、それらを照合するときに特別な処理が必要です。これらの特殊文字と一致させるには、まず文字を「エスケープ」する必要があります。つまり、文字の前にバックスラッシュ文字 () を付けます。次の表は、正規表現内の特殊文字をリストしたものです:
修飾子
修飾子は、一致を満たすために正規表現の特定のコンポーネントが何回出現する必要があるかを指定するために使用されます。 * または + または ? または {n} または {n,} または {n,m} の 6 種類があります。
正規表現修飾子は次のとおりです:
大きな入力ドキュメントでは章番号が 9 を超える可能性があるため、2 桁または 3 桁の章番号を処理する方法が必要です。修飾子はこの能力を与えます。次の正規表現は、任意の桁数で番号付けされた章タイトルに一致します:
/Chapter [1-9][0-9]*/
修飾子が範囲式の後に表示されることに注意してください。したがって、範囲式全体 (この場合は 0 から 9 までの数値のみ) に適用されます。
2 番目以降の位置に必ずしも数字を入れる必要がないため、ここでは + 修飾子は使用されません。それも使わないの?章番号が 2 桁に制限されているためです。章の後に少なくとも 1 つの数字とスペース文字が一致する必要があります。
章番号が 99 章のみに制限されていることがわかっている場合は、次の式を使用して少なくとも 1 桁、最大 2 桁を指定できます。
/Chapter [0-9]{1,2}/
上記の式の欠点は、99 より大きい章番号が最初の 2 桁にしか一致しないことです。もう一つの欠点は、Chapter 0 も一致することです。 2 桁のみに一致するより適切な表現は次のようになります:
/Chapter [1-9][0-9]?/
または
/Chapter [1-9][0-9]{0, 1} /
*、+、および ? 修飾子はすべて、できるだけ多くのリテラルと一致するため、それらの後に ? を追加するだけで非貪欲一致または最小限の一致が実現されます。
たとえば、HTML ドキュメント内で H1 タグで囲まれた章のタイトルを検索するとします。文書内のテキストは次のようになります:
<H1>第 1 章 – 正規表現の概要</H1>
次の式は、開始小なり記号 (<) から終了 H1 タグの大きい方まで一致します。 - より記号 ( >)。
/<.*>/
開始 H1 タグのみを一致させる必要がある場合、以下の「非貪欲」式は <H1> のみに一致します。
/<.*?>/
*、+、または ? 修飾子の後に ? を置くと、式は「貪欲な」式または最小一致に変換されます。
ロケーター
ロケーターを使用すると、正規表現を行の先頭または末尾に固定できます。また、単語内、単語の先頭、または単語の末尾に表示される正規表現を作成することもできます。
ロケーターは文字列または単語の境界を表すために使用され、^ と $ はそれぞれ文字列の先頭と末尾を指し、b は単語の前または後ろの境界を表し、B は単語以外の境界を表します。 。
正規表現の修飾子は次のとおりです:
注: 修飾子はアンカー ポイントでは使用できません。改行または単語境界の直前または直後に複数の位置を置くことはできないため、^* などの表現は許可されません。
テキスト行の先頭のテキストを照合するには、正規表現の先頭に ^ 文字を使用します。この ^ の使用と括弧内の式の使用を混同しないでください。
テキスト行の末尾のテキストと一致するには、正規表現の末尾に $ 文字を使用します。
章タイトルを検索するときにアンカー ポイントを使用するには、次の正規表現は、末尾に 2 桁のみを含み、行の先頭に表示される章タイトルと一致します:
/^Chapter [1-9][0 -9] {0,1}/
実際の章のタイトルは行の先頭に表示されるだけでなく、行内の唯一のテキストでもあります。これは、行の先頭と同じ行の末尾の両方に表示されます。次の式は、指定された一致が相互参照ではなく章のみに一致することを保証します。これを行うには、テキスト行の先頭と末尾のみに一致する正規表現を作成します。
/^Chapter [1-9][0-9]{0,1}$/
は、単語の境界を若干異なる方法で照合しますが、正規表現に重要な機能を追加します。単語の境界は、単語とスペースの間の位置です。非単語境界は、その他の位置です。次の式は、Chapter という単語の最初の 3 文字と一致します。これらの 3 文字は単語境界の後に出現するためです。
/bCha/
b 文字の位置は非常に重要です。単語の先頭が一致する文字列の先頭にある場合は、その単語の先頭で一致するものを探します。それが文字列の末尾にある場合は、単語の末尾で一致するものを探します。たとえば、次の式は、単語 Chapter の文字列 ter と一致します。これは単語境界の前にあるためです。
/terb/
次の式は、Chapter 内の文字列 apt には一致しますが、aptitude 文字列 apt には一致しません。
/Bapt/
文字列 apt は、単語 Chapter では単語以外の境界で発生しますが、単語 aptitude では単語境界で発生します。 B 非単語境界演算子の場合、単語の先頭か末尾が一致するかどうかは関係ないため、位置は重要ではありません。
選択
すべての選択項目をかっこで囲み、隣接する選択項目を | で区切ります。ただし、括弧を使用すると、関連する一致がキャッシュされるという副作用が生じます。この場合、最初のオプションの前に ?: を使用すると、この副作用を排除できます。
そのうち、?: は非キャプチャ要素の 1 つであり、他の 2 つの非キャプチャ要素は ?= と ?! です。これら 2 つは前方参照であり、括弧内の正規表現と一致します。検索文字列は、式パターン内の任意の位置で一致します。これは、正規表現パターンと一致しない任意の先頭位置で検索文字列と一致する否定先読みです。
後方参照
正規表現パターンまたはパターンの一部をかっこで囲むと、関連付けられた一致が一時バッファーに保存され、キャプチャされた各部分一致が正規表現パターン内で左から右に並べられ、出現順に保存されます。バッファ番号は 1 から始まり、最大 99 個のキャプチャされた部分式を保存できます。各バッファーには、「n」を使用してアクセスできます。n は、特定のバッファーを識別する 1 桁または 2 桁の 10 進数です。
キャプチャは、関連付けられた一致の保存を無視して、非キャプチャ メタキャラクタ「?:」、「?=」、または「?!」を使用してオーバーライドできます。
後方参照の最もシンプルで便利なアプリケーションの 1 つは、テキスト内で隣接する 2 つの同一の単語の一致を見つける機能です。次の文を例に挙げます:
ガソリンのコストは上がりますか?
上の文には明らかに複数の単語が繰り返されています。各単語の繰り返しを探すことなく、この文を見つける方法を工夫するとよいでしょう。次の正規表現は、単一の部分式を使用してこれを実現します。
/b([a-z]+) 1b/gi
は、 [a-z]+ で指定された、1 つ以上の文字を含む式をキャプチャします。正規表現の 2 番目の部分は、以前に取得された部分一致への参照、つまり、括弧表現と完全に一致する単語の 2 番目の出現です。 1 は最初のサブマッチを指定します。単語境界メタキャラクターにより、単語全体のみが確実に検出されます。そうしないと、「発行されました」や「これは」などの語句がこの式で正しく認識されません。
正規表現の後のグローバル タグ (g) は、入力文字列内で見つかったすべての一致にその式が適用されることを示します。式の末尾にある case-insensitive (i) タグは、大文字と小文字を区別しないことを指定します。複数行タグは、改行文字のどちらかの側で発生する可能性のある一致を指定します。
後方参照は、ユニバーサル リソース インジケーター (URI) をそのコンポーネントに分割することもできます。次の URI をプロトコル (ftp、http など)、ドメイン アドレス、ページ/パスに分割するとします:
http://www.php.cn:80/html/html-tutorial.html
以下の正規表現はこの機能を提供します:
/(w+)://([^/:]+)(:d*)?([^# ]*)/
最初の括弧の部分式は、Web アドレスのプロトコル部分をキャプチャします。この部分式は、コロンと 2 つのスラッシュが前にある任意の単語と一致します。 2 番目の括弧部分式は、アドレスのドメイン アドレス部分を取得します。部分式は、/ と : を除く 1 つ以上の文字と一致します。 3 番目の括弧内の部分式は、ポート番号 (指定されている場合) を取得します。この部分式は、コロンに続く 0 個以上の数字と一致します。この部分式は 1 回だけ繰り返すことができます。最後に、括弧で囲まれた 4 番目の部分式は、Web アドレスで指定されたパスおよび/またはページ情報を取得します。この部分式は、# またはスペース文字を含まない任意の文字シーケンスと一致します。
上記の URI に正規表現を適用すると、各部分一致には次のものが含まれます:
最初の括弧で囲まれた部分表現には「http」が含まれます
2 番目の括弧で囲まれた部分表現には「www.php.cn」が含まれます
3 番目の括弧で囲まれた部分表現には「」が含まれます:80"
4 番目の括弧で囲まれた部分式には、「../html/html-tutorial.html」が含まれています
通常フェーズの詳細については、こちらを参照してくださいhttp://php.cn/regexp/regexp-tutorial.html
その他の正規表現の例については、http://www.cnblogs.com/diony/archive/2010/12/16/1908499.html を参照してください