5

次の入力文字列では:

{$foo}foo bar \\{$blah1}oh{$blah2} even more{$blah3} but not{$blarg}{$why_not_me}

{$SOMETHING_HERE}エスケープされていないバックスラッシュが前にないすべてのインスタンスに一致させようとしています。

例:

一致させたいのですが、そうで{$SOMETHING}はありません\{$SOMETHING}

でも合わせたい\\{$SOMETHING}

試み:

これまでの私の試みはすべて、タグが隣り合っていることを除いて、私が望むものと一致します{$SOMETHING}{$SOMETHING_ELSE}

これが私が現在持っているものです:

var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more{$blah3} but not{$blarg}{$why_not_me}';
var results = input.match(/(?:[^\\]|^)\{\$[a-zA-Z_][a-zA-Z0-9_]*\}/g);
console.log(results);

どの出力:

["{$foo}", "h{$blah2}", "e{$blah3}", "t{$blarg}"]

ゴール

私はそれが欲しい:

["{$foo}", "{$blah2}", "{$blah3}", "{$blarg}", "{$why_not_me}"]

質問

誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

1

他のすべてが失敗した場合は、分割、結合、またはがらくたを置き換えます。

注: 最初の分割/結合は、実際にはクリーンアップ部分です。それは \{<*>} を殺します

また、括弧内のコードは既にあるため、説明しませんでした。

var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more\\\\{$blah3} but not{$blarg}{$why_not_me}';

input.split(/(?:[^\\])\\\{[^\}]*\}/).join('').replace(/\}[^\{]*\{/g,'},{').split(/,/));
于 2012-04-10T01:32:01.000 に答える
1

ここでの問題は、JavaScript 正規表現がサポートしていない後読みが必要なことです。

基本的に、「${whatever} の前に二重のスラッシュがあり、単一のスラッシュではない場合」が必要です。これは、後読みが行うことです。

後読みの単純なケースを模倣できますが、この例で役立つかどうかはわかりません。試してみてください: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

編集 ところで、これを「ばかげた方法」で行うことはできないと思います[^\\]\{。これをきれいに行うには、後読みが本当に必要です。

そうでなければあなたができる

(\\*{\$[a-zA-Z_][a-zA-Z0-9_]*\})

次に、結果のトークンのバックスラッシュの数を数えます。

于 2012-04-09T23:28:20.513 に答える
0

これは私が望むことをするようです:

var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more\\\\{$blah3} but not{$blarg}{$why_not_me}';

var results = [];
input.replace(/(\\*)\{\$[a-z_][a-z0-9_]*\}/g, function($0,$1){
    $0 = $0.replace(/^\\\\/g,'');
    var result = ($0.indexOf('\\') === 0 ? false : $0); 

    if(result) {
        results.push(result);
    }
})

console.log(results);

これは次のようになります。

["{$foo}", "{$blah2}", "{$blah3}", "{$blarg}", "{$why_not_me}"]
于 2012-04-09T23:43:29.080 に答える