2016-06-22 2 views
0

私はReg ^(?>A|.)*Cに文字列ABC(これはhereで見ることができます)に原子グループを含めることで、いくつかの試合を提供しています。RegExバックトラッキング

[デバッガ]タブで、エンジンが正常に一致しようとするすべてのステップが表示されますが、理由が見つからず、何らかのステップが実行される理由がわかりません。私の質問は、下図されています

enter image description here

答えて

2

私はそれが紛らわしいことに同意します。バックトラックについて話すとき、通常、正規表現エンジンはテキストを逆方向に移動し、以前に消費した文字をあきらめることを意味します。あなたの正規表現はステップ12で(?>A|.)*Cをあきらめて、正規表現内のCがそれにマッチしなければならないときに一度しか行いません。

しかし、デバッガは、何かと一致しようとすると失敗するステップにもBACKTRACKラベルを適用します。これは、ステップ6、9、および12で、ABに一致させようとしたときに、Cに、次に何もない(文字列の最後に)試みるときに起こります。もちろん、推論ステップ13では、.と何も一致させようとしない場合は、BACKTRACKというラベルを付ける必要があります。

RegexBuddyのデバッガは、そのステップをバックトラックとしてラベル付けします。出力は次のとおりです。

RegexBuddy debugger output

あなたが記載されている少数のステップがある見ることができますが、それは省いているものを私に聞かないでください。 RegexBuddyは、Regex101があまりにも多くの情報を提供しているかどうかを判断するための情報はあまりにも少ないです。 :P

アトミックグループは、あなたの例では全く効果がありません。キャプチャしていないグループに切り替えると、出力はまったく同じになります。 (DEMO)これらの効果を確認したい場合は、の原子グループに入れます。 (DEMO

+0

ありがとうアラン。私はRegexBuddyも私の質問をする前にチェックし、うまく指摘しました。写真の中の最初の質問として、*私はなぜ私のビジョンエンジンで意味していた*ここでバックトラックは*は、すべての必要はありません追加の手順が必要です。私は 'B'エンジンにマッチさせた後にバックトラックしなければならず、' C'にマッチするようにまっすぐ進むのではないという理由は見つけられません。私は、ステップ8からステップ14までの線を描き、それがどのように終了すべきかと言うことができると言っています。あなたは私を修正するかもしれません。 – revo

+0

グループは一度に1文字しか一致できません。最初に 'A'を試す必要があります。 –

+0

はい、私はそれを得ました。これらのデバッグのヒントを勉強するいくつかの情報源はありますか? – revo

2

原子団(?> )*が自動的に離れてグループ内の任意のトークンで思い出したすべてのバックトラックポジションをスローします。以下のよう :それは

ステップ7 .Bと一致し、原子団は、すべてのポジションをバックトラック

ステップ8をドロップ(0回以上(可能な限り最も量に一致する))と一致します(とその後後戻りはありません)人間があなたの文字列を読むのは容易であり、ソース文字列の最後の文字がCであることを確認しますが、正規表現エンジンは貪欲な*を見て、エンジンが文字のテストを続けるようにします。この時点でエンジンは文字列内のCを見て最後の文字であることを確認することができませんので、最初にバックトラックしてCを試合に追加しようとすると、9〜13の追加ステップが発生します。

Step 9 the expression attempts to match the `C` with an `A` but this fails so it backtracks to attempt the alternation 
Step 10 the `.` then attempts to match the `C` and succeeds 
Step 12 the expression is now testing the end of the string to see if it matches the `A` and fails to match the end of the string 
Step 13 the expression tests the end of the string with a `.` and fails so it backtracks 
Step 14 it back tracked so that the `C` at the end of your expression will match the `C` in the input string 
+0

ありがとうございますが、私の質問に対する答えではなく、人間の判読可能な方法でこれらのステップを翻訳しただけです。私はなぜこれらのステップを取ったのですか?マッチを終了するためにステップ8の後にエンジンが 'C 'にマッチしないのはなぜですか?私はあなたの9番目の説明されたステップも理解できません。 ( 'B'にマッチした後、式は' C'と 'A'をマッチさせようとします。) – revo

+0

私は何が起こっているの肉体に質問を更新しました –

+0

ありがとう@RoYoMi – revo

関連する問題