英語の原文はSmashing Magazineからのものです。 ベンヒューアーによる翻訳。転載の際は出典を明記してください。
正規表現(正規表現、略称 regex) は強力で、大きな文字列の中から必要な情報を検索するために使用できます。従来の文字構造式を使用して動作します。残念ながら、単純な正規表現は一部の高度なアプリケーションには十分強力ではありません。フィルタリング構造がより複雑な場合は、高度な正規表現を使用する必要がある場合があります。
この記事では、正規表現の高度なテクニックを紹介します。一般的に使用される 8 つの概念を選別し、例を使用して分析しました。各例は、特定の複雑な要件を満たすための簡単な記述方法です。正則化の基本概念がまだ理解できていない場合は、まずこの記事、このチュートリアル、または Wiki エントリを読んでください。
ここでの通常の構文は PHP に適しており、Perl と互換性があります。
1. 貪欲/怠惰
複数回修飾できる通常の演算子はすべて貪欲です。これらはターゲット文字列の可能な限り一致します。つまり、一致結果は可能な限り長くなります。残念ながら、このアプローチは常に私たちが望むものであるとは限りません。したがって、問題を解決するために「lazy」修飾子を追加します。各欲張り演算子の後に「?」を追加すると、式は可能な限り短い長さのみに一致します。さらに、修飾子「U」を使用すると、複数回修飾できる演算子を遅延化することもできます。貪欲と怠惰の違いを理解することは、高度な正規表現を使用するための基礎です。
貪欲な演算子
演算子 * は、前の式に 0 回以上一致します。貪欲な運営者です。次の例を参照してください。
preg_match( '/<h1>.*< /h1>/', '</h1><h1>これはタイトルです。</h1>
<h1>これは別のものです。 </h1>', $matches );
ピリオド (.) は、改行文字を除く任意の文字を表すことができます。上記の正規表現は、h1 タグとタグ内のすべてに一致します。ピリオド (.) とアスタリスク (*) を使用して、タグ内のすべてのものと一致します。マッチング結果は以下の通りです。
<h1>これはタイトルです。 </h1>
<h1>これは別のものです。 </h1>
文字列全体が返されます。 * 演算子は、行内のすべて (中央の終了 h1 タグも含む) と一致します。これは貪欲であるため、文字列全体を一致させることは、利益を最大化するという原則に沿っています。
怠惰な演算子
上記の式を少し変更し、疑問符 (?) を追加して式を遅延にします。
/<h1>.*?< /h1>/</h1>
このようにすると、最初の h1 終了タグに一致するだけでタスクを完了できるようになります。
同様のプロパティを持つもう 1 つの貪欲演算子は、{n,} です。これは、前の一致パターンが n 回以上繰り返されることを意味します。疑問符が追加されていない場合は、できるだけ多くの繰り返しが検索されます。疑問符が追加されている場合は、できるだけ繰り返しません。 n 倍」が最小値です)。
#文字列の作成
$str = 'ひひひ、おっと、こんにちは';
# 貪欲な {n,} 演算子を使用して照合します
preg_match( '/(hi){2,}/', $str, $matches ); # 一致[0] は 'hihihi' になります
# 劣化した {n,} 演算子を使用して照合しますか?
preg_match( '/(hi){2,}?/', $str, $matches ); # 一致[0] は 'hihi' になります
出典:愚かな仕事