正規表現の世界では、重複マッチングの概念を効果的に扱うのが難しい場合があります。この問題を具体的な例で見てみましょう。
問題ステートメント:
「nnnn」のような文字列を考えてみましょう。目標は、重複を考慮しながら、「nn」の出現をすべて識別することです。つまり、目的の出力は 3 つの一致となります:
<code>nnnnn n nnn nn nnn</code>
解決策 1: 前方アサーション
考えられる解決策の 1 つは、前方アサーションの使用です。
<code>(?<=n)nn</code>
この式は、一致の前に「n」が出現することを保証します。各「nn」部分文字列の終了位置を返します。
解決策 2: 否定的な主張
より直観的なアプローチは、否定的なアサーションを使用することです:
<code>(?=nn)</code>
この式は、現在位置の後に「nn」が続くかどうかをチェックします。ただし、実際の「nn」シーケンスはキャプチャされません。
改善されたソリューション: 前方アサーションとグループのキャプチャを組み合わせる
重複する "nn" 部分文字列をキャプチャするには、前方アサーションとキャプチャ グループを組み合わせることができます。
<code>(n)(?=(n))</code>
この式は、group(1) の最初の「n」と group(2) の次の「n」をキャプチャします。キャプチャ グループを使用すると、実際に一致した部分文字列にアクセスできます。
以上が正規表現は、「nnnn」の「nn」のような重複する一致を効果的に処理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。