我在Expresso中找到了一个正则表达式模板,这个工作正常并且返回完美的匹配但是在JavaScript中它不起作用。我知道它可能是为了后视,但我在Regex中的效率不足以使它与JS兼容。
\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\)
我希望将它与......匹配。
max(50, max(51, 60)) a() MAX(s,4,455)something
......它应该返回......
1: (50, max(51, 60))
2: ()
3: (s,4,455)
这在Expresso中非常有效,但Chrome中的JS控制台说:
Uncaught SyntaxError: Invalid regular expression: /\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\)/: Invalid group
如何修改此正则表达式以在JavaScript中正常运行?
答案 0 :(得分:6)
JavaScript不支持named capture groups (?<number>)
正如this question所述,正则表达式可能不适合这项工作。但是,如果您只想匹配最外面的括号组,则可以使用此
/\([^)]*(\s?\))*\)/g
工作
答案 1 :(得分:4)
假设您的给定正则表达式是.NET regular expression,JavaScript不支持以下语法组件:
(?>…)
- nonbacktracking subexpression (?<name>…)
- named matched subexpressions (?<name1-name2>…)
- balancing group definition (?(name)…)
- conditional group 要使用JavaScript获得相同的结果,您需要自己进行平衡:
var parts = str.match(/[()]|[^()]+/g),
matches = [],
balance = 0;
for (var i=0, j=0; i<parts.length; i++) {
switch (parts[i]) {
case "(":
if (balance === 0) {
j = i;
}
balance++;
break;
case ")":
if (balance === 1) {
matches.push(parts.slice(j, i+1).join(""));
}
balance--;
if (balance < 0) {
throw new EvalError('parentheses are not balanced; unexpected "("');
}
break;
}
}
if (balance > 0) {
throw new EvalError('parentheses are not balanced; missing ")"');
}
答案 2 :(得分:2)
Javascript中没有负面的背后隐藏。你必须找到另一种选择。
编辑:我再次看了你的RegEx,我以为我看到了负面的背后,但我想我没有。无论如何,我会将其留作信息用途。
答案 3 :(得分:0)
在javascript中,可以使用[0-9]或\ d定义数字 不是数字是[^ 0-9]或\ D