ホームページ >バックエンド開発 >PHPチュートリアル >正規表現の個人的な理解 - 遅延マッチング、正規表現マッチング_PHP チュートリアル

正規表現の個人的な理解 - 遅延マッチング、正規表現マッチング_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:12:251105ブラウズ

正規表現の個人的な理解 - 遅延マッチング、正規表現マッチング

問題の説明

この記事へのリンク: http://www.hcoding.com/?p=130

初めて正規表現を学習するとき、私はいつも疑問を抱きます。たとえば、文字列「_abc_123_」の最初のペア「_」の間の文字を照合する必要がある場合、私は次のように考えます。これを「/_w*_ /」と書きます。一致結果は「abc」ではなく「abc_123」となり、マスターは疑問符「/_w*?_/」を追加すると言いました。の場合、一致結果は「abc」」になります。

知っていますか? ' を単独で使用する場合は、0 回または 1 回繰り返すことを意味します。一方、'? ' は繰り返し修飾子の後に表示され、その機能は遅延マッチング、つまり可能な限り少ない文字のマッチングです。遅延修飾子の説明:

    *?: 何度でも繰り返しますが、
  • できるだけ少ない回数にしてください
  • +?: 1 回以上繰り返します
  • ただし、できるだけ少なく繰り返します
  • ??: 0 回または 1 回繰り返します
  • ただし、できるだけ少なく繰り返します
  • {n,m}?: n から m 回繰り返しますが、できるだけ少なく繰り返します
  • {n,}?: n 回以上繰り返しますが、できるだけ少なく繰り返します
  • はい、「できる限り減らす」、これは遅延マッチングの大雑把で簡単な説明です。
それでは、「繰り返しをできるだけ少なくする」ということをどのように理解すればよいでしょうか?これは、正規表現の無視される優先度数量子から説明できます。

優先度数量子を無視する

数量子「*?」、「+?」、「??」、「{n,m}?」、「{n,}?」はすべて無視される優先度数量子です。無視される優先度数量子は、?、+ で使用されます。 , * と {} の後に ? を追加することで構成されます。無視する優先度は、マッチング時に最初に無視を試行し、失敗した場合はバックトラックしてから試行することを選択します。たとえば、「ab??」が「abb」と一致する場合、「ab」ではなく「a」が取得されます。エンジンが a と正常に一致すると、優先順位を無視するため、エンジンは最初に b と一致しないことを選択し、式が終了したことが判明した場合は、一致が成功したことを直接報告します。具体的には、次の例を使用して、優先度数量詞を無視する動作原理を段階的に説明します。

上記の例と同様に、「

/_w*?_/

」を使用して、「

_abc_123_」の最初の「_」のペア間の文字を一致させます。 最初の '_' の一致を開始した後、'w*?' は優先度数量子を無視するため、最初にどの文字とも一致する必要がないと判断します。このとき、式 '/_w*?

_

/' 2 番目の '_' ('w*?' の後の '_') は、ターゲット文字列 '_abc_123_' の 'a' と一致します。一致が失敗した場合は、 'w*?' が使用され、一致しないブランチが試行されます (w を使用して a を一致させます) 次のステップでは、一致させるべきでしょうか、それとも無視すべきでしょうか? 「w*?」は優先度数量子を無視するため、前のステップを繰り返しますが b に一致せず、「w*?」は上記のステップを繰り返した後、一致しない分岐 ab を試みます。 3 回 (式「w*?」の後の「_」がターゲット文字列の 2 番目の「_」と一致するまで)、最終的に「abc」が一致します。

プロセス (最初の「_」の一致を開始した後):

式 /_w*?

    _
  • /' の 2 番目の '_' は、ターゲット文字列 '_abc_123_' の 'a' と一致しますが、一致は 'w で失敗します。 *?'ターゲット文字列 '_abc_123_' 内の 'a' との一致を試みると、一致は成功します。 式 /_w*?
  • _
  • /' の 2 番目の '_' は、ターゲット文字列 '_abc_123_' の 'b' と一致し、一致は 'w で失敗します。 *?'ターゲット文字列 '_abc_123_' 内の 'ab' との一致を試みます。一致は成功します。 式 /_w*?
  • _
  • / の 2 番目の '_' は、ターゲット文字列 '_abc_123_' の 'c' と一致しますが、一致は 'w で失敗します。 *?'ターゲット文字列 '_abc_123_' 内の 'abc' との一致を試みると、一致は成功します。 式 /_w*?_
  • /' の 2 番目の '_' は、ターゲット文字列 '_abc_123_' の '_' と一致し、一致が成功し、一致が終了します。 。結果はABCです。 上記は、「Mastering Regular Expressions」の優先度数量指定子の無視に関するセクションを読んだ後の私の考えです。間違っている点があれば、喜んでアドバイスを受け入れます。ありがとうございます。
この記事へのリンク: http://www.hcoding.com/?p=130

元の記事は、JC&hcoding.com と明記してください

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/921718.html技術記事正規表現の個人的な理解 - 遅延マッチング、正規表現マッチングの問題の説明 この記事へのリンク: http://www.hcoding.com/?p=130 初めて正規表現を学ぶとき、たとえば...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。