正規表現とは何か、その使い方を詳しく解説

阿神
リリース: 2023-03-06 10:46:02
オリジナル
8966 人が閲覧しました

1. 正規表現とは

正規表現 (正規表現) は、次の目的で使用できる文字列の一致パターンを記述します。特定のルールに一致する文字列を取得できます。

(2) 一致ルールに基づいて文字列に対して柔軟な置換操作を実行します。

正規表現は実際に学ぶのが非常に簡単で、さらにいくつかの抽象的な概念も理解しやすいです。正規表現が複雑だと多くの人が感じる理由は、一方で、ほとんどのドキュメントが正規表現を浅いところから深いところまで説明しておらず、概念の順序に注意を払っていないため、理解することが困難であるためです。 ; 一方、さまざまなエンジン 付属のドキュメントでは通常、その独自の機能が紹介されていますが、これらの独自の機能を最初に理解する必要はありません。

関連コース:

ブール教育正規表現ビデオチュートリアル


2. 正規表現の使用方法

2.1 通常の文字 、数字、漢字、アンダースコア以下の章で特に定義されていない句読点はすべて通常の文字です。式内の通常の文字は、文字列と一致する場合、同じ文字と一致します。

例 1: 式 c、文字列 abcdef と一致する場合、一致結果は成功、一致した内容は c、一致した位置は 2 から始まり 3 で終わります。 (注: 添え字が 0 から始まるか 1 から始まるかは、現在のプログラミング言語によって異なる場合があります)。

例 2: 式 bcd、文字列 abcde と一致する場合、一致結果は成功、一致した内容は bcd、一致した位置は 1 から始まり 4 で終わります。

2.2 単純なエスケープ文字 書くのに不便な文字が前に追加されています。実際、私たちはこれらのキャラクターをよく知っています。

正規表現とは何か、その使い方を詳しく解説後の章で特別な用途を持つ他の句読点があります。句読点の前に追加すると、記号そのものを表します。例: ^ と $ には特別な意味があります。文字列内の ^ および $ 文字を抽出する場合は、正規表現を ^ および $ として記述する必要があります。

正規表現とは何か、その使い方を詳しく解説これらのエスケープ文字のマッチング方法は、通常の文字のマッチング方法と同様です。同じ文字にも一致します。

例: 式 $d、文字列 abc$de と一致する場合、一致結果は次のとおりです: 一致した内容は次のとおりです: $d; 一致した位置は 3 から始まり 5 で終わります。 「複数の文字」と一致する可能性があります

正規表現の一部の表現方法は、複数の文字のいずれか 1 つと一致します。たとえば、式 d は任意の数値と一致します。どの文字とも一致しますが、一致できるのは 1 つだけであり、複数にすることはできません。これはポーカーをプレイするときと同じで、キングは任意のカードを置き換えることができますが、ジャックポットは 1 枚のカードを置き換えることができます。

例 1: 式 dd、abc123 と一致する場合、一致結果は次のとおりです: 一致した内容は 12、一致した位置は 3 から始まり 5 で終わります。

例 2: 式 a.d 、 aaa100 と一致する場合、一致結果は成功、一致した内容は aa1、一致した位置は 1 から始まり 4 で終わります。

正規表現とは何か、その使い方を詳しく解説

2.4 「複数の文字」に一致する式をカスタマイズする

角括弧 [] を使用して、任意の 1 文字に一致する一連の文字を含めます。 [^] を使用すると、一連の文字を含めることができ、その中の文字を除く任意の文字と一致します。同様に、それらのいずれかを一致させることはできますが、一致できるのは 1 つだけであり、複数ではありません。

例 1: 式 [bcd][bcd] が abc123 と一致する場合、一致結果は成功、一致した内容は bc、一致した位置は 1 から始まり 3 で終わります。

例 2: 式 [^abc] が abc123 に一致する場合、一致結果は成功、一致した内容は 1、一致した位置は 3 から始まり 4 で終わります。

正規表現とは何か、その使い方を詳しく解説

2.5 一致の数を変更する特殊なシンボル

前の章で説明した式は、1 種類の文字にのみ一致する式であっても、複数の文字に一致する式であっても、一致できるのは 1 回だけです。式と一致の数を変更する特殊記号を使用すると、式を再度記述しなくても、繰り返し一致させることができます。

使用方法は、修正式の後に「修正回数」を入れます。例: [bcd][bcd] は [bcd]{2} と記述できます。

正規表現とは何か、その使い方を詳しく解説

例 1: 式 d+/.?d* が $12.5 に一致する場合、一致結果は成功、一致した内容は 12.5、一致した位置は 10 から始まり 14 で終わります。

例 2: 式 go{2, 8}gle が goooooogle の広告と一致する場合、一致結果は成功、一致したコンテンツは goooooogle、一致した位置は 7 から始まり 17 で終わります。

2.6 抽象的な意味を表すその他の記号

一部の記号は、式における抽象的な特別な意味を表します:

正規表現とは何か、その使い方を詳しく解説

これ以上のテキスト説明はまだ比較的抽象的であるため、誰もが理解できるように例を示します。

例 1: 式 ^aaa が xxx aaa xxx と一致する場合、一致結果は失敗となります。 ^ は文字列の先頭と一致する必要があるため、^aaa は aaa xxx xxx のように aaa が文字列の先頭にある場合にのみ一致します。

例 2: 式 aaa$ が xxx aaa xxx と一致する場合、一致結果は失敗になります。 $ は文字列の末尾と一致する必要があるため、aaa$ は、xxx xxx aaa のように aaa が文字列の末尾にある場合にのみ一致します。

例 3: 式 .b. @@@abc と一致する場合、一致する結果は次のとおりです: @a 一致する位置は 2 から始まり 4 で終わります。

詳しい説明: b は ^ や $ に似ており、それ自体ではどの文字とも一致しませんが、一致結果の位置の両側にある必要があり、その一方の側は w の範囲で、もう一方の側は w の範囲です。は非 w 範囲です。

例 4: 式 bendb がweekend、endfor、endに一致する場合、一致する結果は成功、一致する内容はend、一致する位置は15から始まり18で終わります。

一部の記号は、式内の部分式間の関係に影響を与える可能性があります。

正規表現とは何か、その使い方を詳しく解説

例 5: 式 Tom|Jack が文字列 I'm Tom, he is Jack と一致する場合、一致結果は次のようになります。は: Tom、一致した位置は 4 で始まり 7 で終わります。次の一致の結果は次のとおりです。一致した内容は 15 で始まり、19 で終わります。

例 6: 式 (gos*)+ が Let's go go go! に一致する場合、一致する結果は success、一致する内容は go go go、一致する位置は 6 から始まり 14 で終わります。

例 7: 式 \(d+.?d) が $10.9,¥20.5 と一致する場合、一致結果は成功、一致した内容は¥20.5、一致した位置は 6 から始まり 10 で終わります。括弧範囲のみを取得して一致する内容は、20.5 です。


3. 正規表現での高度な使用法

3.1 一致数の貪欲と非貪欲

貪欲モード:

変更されたマッチングを使用する場合度の特殊記号を使用すると、同じ式を同時に異なる時刻に一致させることができるいくつかの表現方法があります。たとえば、「{m, n}」、「{m,}」、?、*、+ などです。 、特定の一致時間は、一致する文字列によって異なります。このように無限に繰り返されるマッチング式は、マッチング プロセス中に常に可能な限り多くの回数マッチングされます。たとえば、テキスト dxxxdxxxd の例は次のとおりです。

正規表現とは何か、その使い方を詳しく解説

一致する場合、w+ は常にそのルールに準拠する可能な限り多くの文字と一致することがわかります。 2 番目の例では最後の d と一致しませんが、式全体が正常に一致するようにするためでもあります。同様に、* と "{m, n}" を含む式は可能な限り一致し、? を含む式も一致するかどうかに応じて可能な限り一致します。このマッチング原理は貪欲モードと呼ばれます。

非貪欲モード:

一致の数を変更する特殊記号の後に ? 記号を追加して、不特定の数の一致を含む式の一致をできるだけ少なくし、一致するか一致しない式をできるだけ「不一致」にできるようにします。可能。このマッチング原理は非貪欲モードと呼ばれ、非貪欲モードとも呼ばれます。一致する数が少ない場合、正規表現全体の一致は失敗します。貪欲モードと同様に、非貪欲モードでも、正規表現全体が正常に一致するように最小限の一致が行われます。たとえば、テキスト「dxxxdxxxd」の場合:

正規表現とは何か、その使い方を詳しく解説

その他の例は次のとおりです。

例 1: 式

(.*) および文字列 ;p>aa

bb

一致した場合、一致した内容は次のとおりです。

aa

bb

式内の は、文字列 最後の が一致します。

例 2: 対照的に、式

(.*) が例 1 の同じ文字列と一致する場合、

aa

> ; を再度一致させると、2 番目の

bb

を取得できます。

3.2 後方参照 1,2...

式が一致すると、式エンジンは括弧 () に含まれる式と一致した文字列を記録します。一致結果を取得する場合、括弧内に含まれる式と一致した文字列を個別に起動できます。これは、前の例で何度も実証されています。実際のアプリケーションでは、ある境界を使って検索し、取得したい内容にその境界が含まれない場合には、括弧を使って範囲を指定する必要があります。たとえば、前の

(.*?)

実は、「括弧内に含まれる式と一致した文字列」は、マッチング完了後に利用できるだけでなく、マッチング処理中にも利用することができます。式の後の部分は、前の「文字列とすでに一致した括弧内の部分一致」を参照できます。参照方法は数値を加算することです。 1 は最初の括弧のペアで一致した文字列を参照し、2 は 2 番目の括弧のペアで一致した文字列を参照します。以下同様に、括弧のペアに別の括弧のペアが含まれる場合は、外側の括弧が最初に並べ替えられます。つまり、左括弧のどのペア ( ( が最初に来ると、このペアが最初にソートされます。

例 1: 式 ('|")(.*?)(/1) は、'Hello'、"World に一致します。 "、一致結果は成功です。一致した内容は 'Hello' です。次のものを一致させる場合、"World" と一致する可能性があります

例 2: 式 (w)1{4,}。aa bbbb abcdefg と一致する場合ccccc 111121111 999999999、一致した結果は成功、一致した内容は cccccc になります。この式では、w 範囲の文字を少なくとも 5 回繰り返す必要があることに注意してください。 {5,} の違い

例 3: 式 .*?

が一致しない場合、一致結果は成功です。別のペアリングに変更すると、マッチングは失敗します。

3.3 事前検索、一致なし、逆事前検索、一致なし

前の章で、次について説明しました。いくつかの抽象的な意味。特殊記号: ^、$、b。それらはすべて、文字自体には一致せず、「文字列の末尾」または「文字列間のギャップ」に条件を付加するだけであるという共通点があります。この概念の後、このセクションでは、「両端」または「ギャップ」に条件を付ける別のより柔軟な方法を引き続き紹介します

前方事前検索: (?=xxxxx) 、 (?!xxxxx)

形式: (?=xxxxx)、一致した文字列内で、それが含まれる「ギャップ」または「両端」の追加条件は、ギャップの右側が xxxxx 部分の式と一致できる必要があります。これはこのギャップの追加条件としてのみ使用されるため、このギャップの後の文字と実際に一致する後続の式には影響しません。これは、それ自体ではどの文字とも一致しない b に似ています。 b はギャップの前後の文字を取得して判断するだけで、その後の実際のマッチングには影響しません。

例 1: Windows(?=NT|XP) という式が Windows 98、Windows NT、および Windows 2000 と一致する場合、Windows NT の Windows のみと一致し、他の Windows の単語は一致しません。

例 2: 式 (w)((?=111)(1))+ が文字列 aaa ffffff 9999999999 に一致する場合、6 f の最初の 4 と 9 9 の最初の 7 に一致します。この式は、文字と数字が 4 回以上繰り返された場合、最後の 2 桁より前の部分が一致すると解釈できます。もちろん、この式はこのように記述する必要はありませんが、デモンストレーションの目的でのみ使用されます。

形式: (?!xxxxx) は、ギャップの右側にあり、式の xxxxx 部分と一致してはなりません。

例 3: 式 ((?!bstopb).)+ が fdjka ljfdl stop fjdsla fdj と一致する場合、先頭から stop より前の位置まで一致します。文字列に stop がない場合は、全体と一致します。弦。

例 4: 式 do(?!w) が文字列 Done, do, Dog と一致する場合、一致できるのは do のみです。この例では、do の後に (?!w) を使用すると、b を使用した場合と同じ効果があります。

逆方向事前検索: (?

これら 2 つの形式の概念は、順方向事前検索と似ています。 逆方向事前検索に必要な条件は次のとおりです。ギャップの「左側」では、2 つの形式はそれぞれ、右側を判断するのではなく、指定された式と一致する必要があることと、一致できないことを要求します。ギャップへの追加であり、文字自体には一致しないという点で、「前方事前検索」と同じです。


4. その他の一般的なルール

4.1 ルール 1

式では、xXX および uXXXX を使用して文字を表すことができます (X は 16 進数を表します)。

正規表現とは何か、その使い方を詳しく解説

4.2 ルール2

式s、d、w、bは特別な意味を表しますが、対応する大文字は反対の意味を表します

1正規表現とは何か、その使い方を詳しく解説

4.3 ルール3

には特別な意味があります式内にあり、文字自体の文字概要と一致するように追加する必要があります

1正規表現とは何か、その使い方を詳しく解説

4.4 ルール 4

一致結果を実行したくない場合は、括弧 () 内の部分式。後で使用する場合は (?:xxxxx) 形式を使用できます。

例 1: 式 (?:(w)1)+ が「a bbccdd efg」と一致する場合、結果は「bbccdd」になります。括弧 (?:) 範囲内の一致はログに記録されないため、(w) は 1 で囲まれます。

4.5 ルール 5

よく使用される式の属性設定の紹介: Ignorecase、Singleline、Multiline、Global

1正規表現とは何か、その使い方を詳しく解説

関連記事:

PHP で正規表現を使用して括弧を照合する方法

PHP正規表現の一般的な関数の使い方のまとめ

中国語の文字に一致するPHP正規表現の簡単なコード例

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート