JavaScript RegEx匹配问题很严重: 在Java方面,RegEx拆分表达式的行为与JS方面不同。我把它剥离到下面的例子,也许你知道根本原因?
的TestString:
test == 1
。
我希望== 1
匹配(我将在后面使用它作为分割器,但对我的问题无关紧要。)
剥离的正则表达式:
([=\s]+).*?(?:[=]|\z)+
java方面的结果(http://gskinner.com/RegExr/)匹配:== 1
JS方面的结果(http://www.regular-expressions.info/javascriptexample.html)匹配:==
和=
为什么?如何使正则表达式JS的行为与Java端相同?
答案 0 :(得分:3)
JavaScript不支持\A
字符串锚点的\Z
结束和=
结束,因此强制结束$
上的匹配。请改为使用alert(m);
行锚点结束。
编辑:
那里也只有一场比赛。如果您查看code并向其添加alert(m); // ["== 1", "=="]
var s = "Match at position " + m.index + ":\n";
for (i = 0; i < m.length; i++) {
s = s + m[i] + "\n";
}
alert(s);
m[0]
Matcher#group(0)
为您提供实际匹配(就像Java中的m[1]
)和(?:[&=\\s]+)?
第一个组捕获。
编辑 :( Java和JavaScript的 String.split()方法之间存在差异
与Java不同,JavaScript的 split()返回结果数组中分隔符正则表达式中指定的所有捕获组。因此,您需要将第一个正则表达式组无法捕获为{{1}}。
使用Java的 split()方法,结果数组中不包含尾随空字符串。在您的JavaScript代码中,您必须自己忽略它们。但是,考虑到输入字符串的性质(布尔条件),您可以安全地删除最后一个元素,因为输入字符串总是以分隔符结束。