ホームページ  >  記事  >  バックエンド開発  >  可変長後読みアサーションを使用せずに、正規表現で可変長後読みアサーションの機能を実現するにはどうすればよいですか?

可変長後読みアサーションを使用せずに、正規表現で可変長後読みアサーションの機能を実現するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-31 22:07:02144ブラウズ

How can I achieve the functionality of variable-length lookbehind assertions in regular expressions without them?

正規表現の可変長後読みアサーションの代替

/(?<!foo.*)bar/ などの可変長後読みアサーションを使用できます。パターンに先行する可変数の文字について特定の条件が満たされる場合に、パターンと一致します。 Python の regex モジュールなどの一部の正規表現実装は可変長後読みアサーションをサポートしていますが、他の実装で使用できる代替手段もあります。

K: Killing Captured Character

One可変長後読みアサーションの代わりに K 文字を使用します。 K は、後続の一致が最終的にキャプチャされた文字列の一部とみなされるべきではない正規表現内のポイントをマークします。たとえば、次の正規表現:

s/unchanged-part\Kchanged-part/new-part/x

は、文字列「unchanged-partchanged-part」内の部分文字列「changed-part」と一致し、それを「new-part」に置き換えます。ただし、文字列の「変更されていない部分」部分は置換には含まれません。

近似としての負の後読み

一方、K は、次の可変長後読みアサーションの近似に使用できます。一致しますが、それほど柔軟ではありません。たとえば、K を使用する負の後読みアサーションに相当するものはありません。

負の後読みアサーションは、パターンに先行する可変数の文字について特定の条件が満たされない場合に、パターンと一致します。次の正規表現は、前に「foo」がない場合にのみ、負の後読みアサーションを使用して文字列「bar」と一致します。

/(?<!foo.*)bar/

可変長の後読みアサーションを使用しないこの式の近似は、次のようになります。

s/^(?:(?!foo).)*\Kbar/moo/s;

拡張正規表現実装

Perl、Ruby、JavaScript、および PHP の標準正規表現実装は可変長後読みアサーションをサポートしていませんが、拡張正規表現があります。次の各言語で使用できる式の実装:

  • Perl: pcre モジュールは、可変長後読みアサーションのサポートを提供します。
  • Ruby: rexml gem は、可変長の後読みアサーションのサポートを提供します。
  • JavaScript: js-regex ライブラリは、可変長の後読みアサーションのサポートを提供します。
  • PHP: pcre ライブラリは、可変長後読みアサーションのサポートを提供します。

これらの強化された正規表現実装は、可変長後読みアサーションのサポートを含む追加機能と最適化を提供します。

以上が可変長後読みアサーションを使用せずに、正規表現で可変長後読みアサーションの機能を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。