サーチ…


備考

再帰は主にPerl互換のフレーバーで利用できます:

  • Perl
  • PCRE
  • オニグルマ
  • ブースト

全体のパターンを再帰

構造体(?R)(?0) (または\g<0> )と同じ(?0)パターン全体を再帰的に扱うことができます:

<(?>[^<>]+|(?R))+>

これにより、<a b> <a<b>c<d>e>ように、角かっこの間に任意のテキストを含む適切なバランスのとれた角かっこがマッチします。

サブパターンに再帰する

あなたは、以下の構築物(味に応じて)を使用してサブパターンに再帰と仮定することができnキャプチャグループ番号であり、 nameキャプチャグループの名前。

  • (?n)
  • \g<n>
  • \g'0'
  • (?&name)
  • \g<name>
  • \g'name'
  • (?P>name)

次のパターン:

 \[(?<angle><(?&angle)*+>)*\]

次のようなテキストに一致します: [<<><>><>] - 大括弧は大括弧で囲まれています。再帰は、バランスのとれた構文マッチングによく使われます。

サブパターン定義

(?(DEFINE) ... )構文は、後で再帰によって参照できるサブパターンを定義します。パターンに遭遇した場合、それは照合されません

このグループには名前付きサブパターン定義が含まれている必要があります。再帰によってのみアクセスできます。このようにして文法を定義することができます:

(?x) # ignore pattern whitespace
(?(DEFINE)
  (?<string> ".*?" )
  (?<number> \d+ )
  (?<value>
    \s* (?:
        (?&string)
      | (?&number)
      | (?&list)
    ) \s*
  )
  (?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$

このパターンは、次のようなテキストを検証します。

[42, "abc", ["foo", "bar"], 10]

リストには1つ以上の値を含めることができ、値自体をリストにすることができます。

相対的なグループ参照

サブパターンは、 相対的なグループ番号で参照できます。

  • (?-1)前のグループに再帰する
  • (?+1)次のグループに再帰する

\g<N>構文でも使用できます。

再帰における後方参照(PCRE)

PCREでは、再帰の前に後方参照に使用される一致したグループは再帰で保持されます。しかし、再帰の後、彼らはすべてそれがそれに入る前の状態にリセットされます。つまり、再帰のマッチしたグループはすべて忘れてしまいます。

例えば:

(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}

マッチ

aaabba

再帰は原子(PCRE)であり、

PCREでは、再帰の最初の一致が見つかった後にトラックバックを行いません。そう

(?(DEFINE)(aaa|aa|a))(?1)ab

一致しない

aab

それがマッチした後ので、 aa再帰では、それだけで一致して再度お試したことがありません。 a



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow