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

这里的问题是你需要一个lookbehind,这是JavaScript Regexs不支持的

基本上你需要 "${whatever} 如果它前面有一个双斜杠而不是一个单斜杠",这就是后向所做的。

您可以模仿后视的简单案例,但不确定它是否对本示例有所帮助。试一试:http: //blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

编辑 顺便说一句,我认为您也不能以“愚蠢的方式”执行此操作,因为如果您有[^\\]\{,您将匹配大括号前不是反斜杠的任何字符。你真的需要向后看才能干净地做到这一点。

否则你可以做

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

然后只需计算生成的标记中的反斜杠数。

于 2012-04-09T23:28:20.513 回答
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 回答
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 回答