彼らは両方のECMAScript(またはそのスーパーセットを実装するようにかかわらず、問題の、ActionScriptとJavaScriptは常に、同じ結果が得られるはずです、正規表現の場合は同意しないでください)。
はい、これはどの言語(または正規表現のフレーバー)でも起こります。その理由は、キャプチャグループを繰り返しているためです。もっと簡単な例を考えてみましょう:(.)*
とabc
との一致。だから私たちが繰り返すのは(.)
です。初めて試行されると、エンジンがグループに入り、a
と一致して.
となり、グループを離れてa
をキャプチャします。数量化が始まり、それがすべて繰り返されます。グループに再び入って、b
とマッチしてキャプチャします。このキャプチャは前のキャプチャを上書きします。したがって、\1
にはb
が含まれます。 3回目の繰り返しでも同じです。キャプチャはc
で上書きされます。
異なる動作をする正規表現のフレーバはわかりません。上書きするのではなく、以前のすべてのキャプチャにアクセスできる唯一のものは.NETです。
解決策は、1p.sg。提案された。繰り返しのために必要なグループ化を非キャプチャにします(これはキャプチャと上書きをすべて必要としないためパフォーマンスが向上します)、新しいグループにすべてをラップします。あなたの表現には小さな欠点が1つあります。ネゲートされた文字クラスにバックスラッシュを含める必要があります。そうしないと、バックトラッキングは[abc\]
に一致する可能性があります。だからここにあなたが期待通りに動作します式です:
\[((?:\\{2}|\\\]|[^\]\\])*)\]
Working demo.(残念ながら、それはキャプチャを示していないが、それはそれはすべてのケースで正しい対応を与えることを示している)
注あなたのことをexpressionは他のエスケープシーケンスを許さない。特に\
という単一の文字と、それに続く]
という文字のいずれかが続くと、パターンが失敗します。これはあなたが望むものではない場合、あなただけ使用することができます。
\[([^\]\\]*(?:\\.[^\]\\]*)*)\]
Working demo.
:
\[((?:\\.|[^\]\\])*)\]
Working demo.
パフォーマンスがさらに"unrolling-the-loop"技術を向上させることが可能