[英]Regular Expression Guidance needed for Javascript
在以下输入字符串中:
{$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}"]
题
谁能指出我正确的方向?
这里的问题是你需要一个 lookbehind,JavaScript 正则表达式不支持
基本上你需要“${whatever} 如果它前面有一个双斜杠而不是一个单斜杠”,这就是 lookbehind 所做的。
您可以模仿 lookbehinds 的简单情况,但不确定它是否有助于此示例。 给它一个 go: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
编辑顺便说一句,我认为您也不能以“愚蠢的方式”执行此操作,因为如果您有[^\\]\{
您将匹配大括号前不是反斜杠的任何字符。 你真的需要回顾来干净地做到这一点。
否则你可以做
(\\*{\$[a-zA-Z_][a-zA-Z0-9_]*\})
然后只需计算结果标记中反斜杠的数量。
当所有其他方法都失败时,拆分、加入/替换其中的废话。
注意:第一个拆分/合并实际上是清理部分。 那会杀死 \{<*>}
另外,我没有考虑括号内的内容,因为已经有相应的代码了。
var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more\\\\{$blah3} but not{$blarg}{$why_not_me}';
input.split(/(?:[^\\])\\\{[^\}]*\}/).join('').replace(/\}[^\{]*\{/g,'},{').split(/,/));
这似乎做了我想要的:
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}"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.