(?!)
で最初のブランチが失敗するので、後で定義された名前付きキャプチャグループ(?<isa>...)
は何もキャプチャしません(ただし、サブパターンとして定義されています)。
2番目のブランチだけが成功しますが、このグループは "isa"グループのものを取得しません。サブパターンの別名(?&isa_)
を使用します。 "isa_は" どこにも定義されていないので、
Reference to nonexistent named group in regex
:
あなたの最初の例では、警告を返します。
[編集]最初の例では "isa_"を "isa"に変更しましたが、この新しいバージョンでは、 "isa"という名前のグループには何もキャプチャされません。キャプチャグループは、彼らがいない他の場所で、定義されただけで物事を捉えるため、あなたの第二の例はあまりにも「ISA」を、移入しません
は(たとえisa_
はグループisa
を参照。)
理由は、Perlはdoesnのことです再捕捉でキャプチャを保存しないでください(地上レベルのキャプチャのみが保持されます)あなたはこの例でそれをテストすることができます。
"this is a test" =~/
(?!)
(?<isa_>
(?<isa> is \s+ a)
(?{print "isa in recursion: $+{isa}\n"})
)
|
(?&isa_) \s (?<test> test)
/x;
print "isa: $+{isa}\ntest: $+{test}"
しかし、あなたが書くことができます。
"this is a test" =~/
(?!) (?<isa_> is \s+ a)
|
(?<isa> (?&isa_)) \s (?<test> test)
/x;
print "isa: $+{isa}\ntest: $+{test}";
しかし、ここでは、名前付きキャプチャ「ISAは」グランドレベルです。
注:このように
/(?<isa_> (?<isa> is \s+ a)){0}
(?&isa_) \s (?<test> test)
/x
:
/(?(DEFINE)
(?<isa_> (?<isa> is \s+ a))
)
(?&isa_) \s (?<test> test)
/x
か、この1:代わりにパターン失敗し、交代を作るために(?!)
を使用して、あなたは(?(DEFINE)...)
構文を使用することができますあなたは交代の費用を避けます。
答えやコメントに示されたエラーを取り除くために質問を「修正」しないでください。 – Borodin
@Bododin、質問の元の意図が損なわれ、それとその答えから気を散らしています。答えは問題ではなく固定されるべきです。 – Adrian
私は同意しません。あなたの質問に訂正されたコードを追加したのではなく、それを元に戻すのが良いでしょう。しかし、少なくとも修正を必要と感じる場合は、回答を編集してください。現在のところ、あなたの質問は、両方の世界の最悪の答えではありません。 – Borodin