PHPの正規表現キャプチャグループと非キャプチャグループ(詳細)

3564 ワード

プロジェクト開発の過程で正則表現はよく使われ、正則表現はプログラマー一人一人の最も基本的な要求と言えるが、初心者は正則表現に触れたばかりでは骨が折れる.最近、ある友人のブログで書いた「PHP正規表現」を見ると、章ではワイルドカードやデータのキャプチャに興味があります.この2つの章では,正規表現のキャプチャグループと非キャプチャグループの内容についても触れ,この点を分析した.
正規表現の下で(x)は一致'x'を表し、一致した値を記録することを知っている.これは一般的な言い方にすぎず、厳密ではない言い方であり、()キャプチャグループ形式のみがマッチングの値を記録します.非キャプチャグループはマッチングのみ、記録しません.
グループのキャプチャ:
  (pattern)
この形式は最も多く見られる形式であり,一致して捕獲結果を返し,ネストすることができ,グループ番号が左から右に順番に並べられる.
 
  
$regex = '/(ab(c)+)+d(e)?/';   
$str = 'abccde';
$matches = array();
 
if(preg_match($regex, $str, $matches)){
    print_r($matches);
}

照合結果:
 
  
Array ( [0] => abccde [1] => abcc [2] => c [3] => e )
  (?Ppattern)

この方式は正規表現を構築する際にやや複雑に見えるが,実質的には(pattern)と同じである.最大の利点は、結果処理にあり、プログラマは、必要な結果をいくつかのサブグループに数えることなく、自分で設定した直接迅速に結果を呼び出すことができます.
 
  
$regex = '/(?P\w(?P\w))abc(?P\w)45/';

$str = 'fsabcd45';
$matches = array();
 
if(preg_match($regex, $str, $matches)){
    print_r($matches);
}
 
照合結果:
 
  
Array ( [0] => fsabcd45 [group1] => fs [1] => fs [group2] => s [2] => s [group3] => d [3] => d )
  
um

numは整数であり、キャプチャグループへの逆参照です.例えば、2は第2のサブグループの一致値を表し、は第1のサブグループの一致値を表す
 
  
$regex = '/(\w)(\w)\2\1/';   
$str = 'abba';
$matches = array();
 
if(preg_match($regex, $str, $matches)){
    print_r($matches);
}


照合結果:
 
  
Array ( [0] => abba [1] => a [2] => b )

注意して、ここで私は小さな細部を油断して、最初は私の最初のコードは
$regex = “/(\w)(\w)\2\1/”;結果は一致しない結果を返し、デバッグ後、ここでは''''しか使用できないことが分かった.「使い方が違うので注意が必要です.
  \k< name >
(?Ppattern)とumを知って、これは理解に難くありません.kは、名前付きキャプチャグループへの逆参照です.ここでnameはキャプチャグループ名です.
 
  
$regex='/(?P\w)abc\k/';

$str="fabcf";

echo preg_match_all($regex, $str,$matches);

print_r($matches);


照合結果:
 
  
Array ( [0] => Array ( [0] => fabcf ) [name] => Array ( [0] => f ) [1] => Array ( [0] => f ) )

非キャプチャグループ:
  (?:pattern)
(pattern)との唯一の違いは、patternに一致するが、一致結果を取得しないことである.ここでは例を挙げません.
もう4つの方法は実際には1つのことを話しています:事前調査.
プリフェッチは、順方向プリフェッチと逆方向プリフェッチに分けられます.文字通り、順方向プリフェッチは、一致文字列の後ろにある文字が存在するか否かを判断し、逆方向プリフェッチは、一致文字列の前にある文字が存在するか否かを判断する.
正方向予査は使用有無(?=pattern)を判断し、使用有無(?!pattern)を判断する.
逆予查判断有使用(?<=pattern)、判断不存在使用(?
 
  
$regx='/(?<=a)bc(?=d)/';

$str="abcd ebcd abce ebca";

if(preg_match_all($regx, $str, $matches)){

    print_r($matches);
}

照合結果:
 
  
Array ( [0] => Array ( [0] => bc) )

この4つの形式で使われているかどうかは,相対的に一致する文字列の位置や断言が肯定的か否定的かに注意すれば,すぐに把握できる.
また,事前調査の4つの形式はゼロ幅であり,マッチング時には1つの判断のみを行い,それ自体は位置を占めない.HE(?=L)LLO/はHELLOと一致し、/HE(?=L)LO/はHELLOと一致しない.結局,バイト数から両者は一致せず,前者は4個,後者は5個であった.
以上がPHPの正規表現キャプチャグループと非キャプチャグループの詳細な説明のすべてであり,皆さんに啓発してほしい.