6

問題

この文字列に一致する可能性があります

(xx)

この正規表現を使用して

\([^()]*\)

でも似合わないだろうな

(x(xx)x)

したがって、この正規表現は

\([^()]*\([^()]*\)[^()]*\)

ただし、これは一致しません。

(x(x(xx)x)x)

しかし、繰り返しになりますが、この新しい正規表現は

[^()]*\([^()]*\([^()]*\)[^()]*\)[^()]*

これは、レプリケーションに気付くことができる場所です。最初の正規表現の後、\(最後の正規表現の前の 2 番目の正規表現の正規表現パターン全体\)がコピーされ、中央の most が置き換えられます[^()]*。もちろん、この最後の正規表現は一致しません

(x(x(x(xx)x)x)x)

ただし、最後の正規表現で行ったように、いつでも中央を最もコピーして置き換えることができ、[^()]*より多くのグループを取得できます。正規表現に追加すればするほど、処理できる量は増えますが、常に追加する量に制限されます。[^()]*\([^()]*\)[^()]*(xx)

では、この制限をどのように回避し、余分なグループを含めることができるかっこのグループ (または任意の 2 文字) をキャプチャするにはどうすればよいでしょうか?

誤って想定されたソリューション

私はあなたがただ使うと思うかもしれないことを知っています

\(.*\)

しかし、これはすべてに一致します

(xx)xx)

部分文字列のみに一致する必要がある場合(xx)

これでも

\([^)]*\)

のようにペアがネストされた括弧のペアには一致しません

(xx(xx)xx)

これから、 までしか一致しません(xx(xx)

出来ますか?

では、括弧のグループに一致する正規表現を書くことは可能でしょうか? それとも、これはルーチンで処理する必要があるものですか?

編集

ソリューションは、正規表現の JavaScript 実装で機能する必要があります

4

2 に答える 2

2

丸括弧のバランスが取れている場合にのみ一致させたい場合は、regexそれ自体では実行できません..

より良い方法は

1>を使用して文字列を一致させます\(.*\)

2> の数を数え、(それら)が等しいかどうかを確認します。等しい場合は、一致しています

3>それらが等しくない場合は\([^()]*\)、必要な文字列を一致させるために使用します

于 2012-12-15T05:02:58.307 に答える
0

正式には、これは正規表現を使用して行うことはできません! 正規表現は正規言語を定義し、正規言語では括弧のバランスをとることはできません。

しかし、これは人々が常に行う必要のある種類のことであることが判明したため、多くの Regex エンジンが拡張され、形式的な正規表現以上のものを含めるようになりました。したがって、javascript の正規表現を使用して、バランスの取れたブラケットを実行できます。次の記事が参考になるかもしれません: http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx。これは .net 用ですが、標準の JavaScript 正規表現エンジンにも同じことが当てはまります。

個人的には、正規表現エンジンの拡張機能を活用するよりも、このような複雑な問題を独自の関数で解決するのが最善だと思います。

于 2012-12-15T05:20:57.147 に答える