-1

私はしばらく前にこの質問を投稿しましたが、それはよく答えられました: 文字列を分割するための複雑な正規表現

私はそれに関連する新しい難問があることを知っています、そして私は本当にどこにも行きません...

次のような文字列があるとします。

{foo.bar:/?a{3\}}{blah}

前の投稿で提供されたコードを使用して、これを行います:

{foo.bar:/?a
{3\}}
{blah}

私はそれがこれをしたい:

{foo.bar:/?a{3\}}
{blah}

これは、例の2番目の中括弧の前にエスケープがない文字列を処理する必要があるためです。特定の開始中括弧を無視するタイミングを見つけることができるコードが必要です。例えば。文字列を左から右に読むと、最初のオープニングカーリーブレースが表示され、2番目のオープニングカーリーブレースが表示されると、「ちょっと待ってください」と表示されます。有効なクロージングカーリーブレースはまだ表示されていないので、これを無視してください。これは可能ですか?純粋な正規表現を使用しても完全には不可能な場合があることを理解しています。

これは、問題を引き起こしている前の質問から使用しているコードの最初の部分です。

var m = str.match(/{?(\\.|[^{}])+}?/g);

または、別の解決策として、ユーザーが事前に文字列を入力して送信しているときに、ユーザーに表示されずにエスケープするバックスラッシュを挿入することもできます。これに伴う問題は、どのエスケープバックスラッシュをユーザーから再び「非表示」にするかを知ることです...

4

1 に答える 1

3

このようなものはどうですか?

var str = "{foo.bar:/?a{3\}}hello?{blah}world{blah2}";

var rgx = new RegExp(/}(?!})+[^{]*{/g); 

str = str.replace(rgx,"},{");

//document.write(str + "<br/>");

arr = str.split(",");

for(i=0; i<arr.length; i++) {
    document.write(arr[i] + "<br/>");
}

ここで重要なのは正規表現です/}(?!})+[^{]*{/g

}リテラル文字の一致

(?!})+前の一致に続いて、少なくとも1つ}が一致していないと主張します。

[^{]*を除く任意の数の文字に一致します{

{リテラル文字の一致

ここで動作するのを見てください。

于 2012-05-25T14:51:00.737 に答える