3

私は次の段落を理解しようとしています(Php.netから:リンク):

ただし、円記号に続く10進数が10未満の場合は、常に円記号と見なされ、パターン全体で左括弧をキャプチャする数が少ない場合にのみエラーが発生します。つまり、参照される括弧は、10未満の数値の場合、参照の左側にある必要はありません。「前方後方参照」は、繰り返しが含まれ、右側のサブパターンが以前の反復に参加している場合に意味があります。 。

これまでのところ理解しているように、小数が10より小さい場合は、パターンの左括弧がすべてカウントされます。また、数値が10より大きい場合は、参照(たとえば、\ 13)を使用した瞬間の左括弧のみがカウントされます。 。

例えば:

この単純なパターンがあるとしましょう:

'/^(a)(b)(c)(d)\6(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)$/';

This is the string we testing: abcdfefghikjklmn

php.netはこう言っています:

つまり、参照される括弧は、10未満の数値の場合は参照の左側にある必要はありません。

例が示すように、参照される括弧は右側にあり、参照番号は10未満です。なぜ、preg_matchは0を返すのでしょうか。

誰かがこの段落を理解するのを手伝ってくれるなら、みんなありがとう、そして良い一日を。

4

2 に答える 2

2

文字クラスの外では、バックスラッシュの後に0より大きい数字(場合によってはそれ以上の数字)が続くのは、パターンの前(つまり左側)のキャプチャサブパターンへの後方参照です。ただし、以前にキャプチャした左括弧が多数あった場合に限ります。

ただし、円記号に続く10進数が10未満の場合は、常に円記号と見なされ、パターン全体で左括弧をキャプチャする数が少ない場合にのみエラーが発生します。つまり、参照される括弧は、10未満の数値の場合、参照の左側にある必要はありません。「前方後方参照」は、繰り返しが含まれ、右側のサブパターンが以前の反復に参加している場合に意味があります。 。

\n説明(n > 0常に):

  • n <= 9:常にnthグループへの後方参照(キャプチャグループがどこにあるかに関係なく)。nキャプチャグループより少ない場合、エラーが発生します。
  • n >= 10:その前に少なくともn数のキャプチャグループ(開始)がある場合にのみ、バックリファレンス。それ以外の場合は、通常の文字列のようにエスケープシーケンスです。
于 2013-03-08T15:39:31.230 に答える
1

つまり、参照される括弧は、10未満の数値の場合、参照の左側にある必要はありません。「前方後方参照」は、繰り返しが含まれ、右側のサブパターンが以前の反復に参加している場合に意味があります。 。

これは、次のようなものが有効であることを意味します。

(0\2|(112*))+

ご覧のとおり\2、2番目の開き括弧(が検出される前でも、2番目のキャプチャグループへの後方参照が宣言されています。

デモ(regex101によるエラーは無視してください。分析では、このケースは処理されませんでした)

別の有効な例:

^(^a|aa\1)*$

この正規表現はa、長さが平方数である文字列のみを含むすべての文字列に一致し、それ以外の場合は拒否されます。これは、参照されている括弧のペア内の後方参照の例です。

デモ

于 2013-03-08T15:40:07.553 に答える