在以下输入字符串中:
{$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}"]
问题
有人能指出我正确的方向吗?
答案 0 :(得分:1)
这里的问题是你需要一个lookbehind,JavaScript Regexs不支持
基本上你需要“$ {whatever}如果它前面有一个双斜线而不是一个斜线”,这就是lookbehind所做的。
您可以模仿简单的lookbehinds案例,但不确定它是否会对此示例有所帮助。试一试:http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
修改强>
顺便说一下,我认为你不能做这个'愚蠢的方式',因为如果你有[^\\]\{
你将匹配任何在支撑之前不是反斜杠的角色。你真的需要lookbehind干净利落地完成这件事。
否则你可以做到
(\\*{\$[a-zA-Z_][a-zA-Z0-9_]*\})
然后只计算生成的标记中的反斜杠数。
答案 1 :(得分:1)
当其他所有方法都失败时,拆分,加入/替换它的垃圾。
注意:第一个拆分/连接实际上是清理部分。这会杀死\ {< *>}
另外,我没有考虑括号内的内容,因为已有代码。
var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more\\\\{$blah3} but not{$blarg}{$why_not_me}';
input.split(/(?:[^\\])\\\{[^\}]*\}/).join('').replace(/\}[^\{]*\{/g,'},{').split(/,/));
答案 2 :(得分: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}"]