2

我对 JavaScript RegEx 匹配有一个大问题:在 Java 端,RegEx 拆分表达式的行为与 JS 端不同。我已将其简化为以下示例,也许您知道根本原因?

测试字符串: test == 1.

我想要== 1匹配(稍后我将使用它作为拆分器,但对我的问题无关紧要)。

剥离的正则表达式: ([=\s]+).*?(?:[=]|\z)+

java 端 ( http://gskinner.com/RegExr/ ) 的结果匹配:== 1

JS 方面的结果(http://www.regular-expressions.info/javascriptexample.html)匹配:===

为什么?如何使正则表达式 JS 的行为与 Java 端相同?

4

1 回答 1

3

JavaScript 不支持字符串锚点的\A开始和\Z结束,因此被迫在=. 改用$行尾锚。

编辑
那里也只有一场比赛。如果您查看代码并添加alert(m);到其中

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]第一组 capture

编辑:(Java 和 JavaScript 的String.split()方法的区别)

  • 与 Java 不同,JavaScript 的split()在结果数组中返回在分隔符正则表达式中指定的任何捕获组。因此,您需要使您的第一个正则表达式组不被捕获为(?:[&=\\s]+)?.

  • 使用 Java 的split()方法,结果数组中不包含尾随的空字符串。在您的 JavaScript 代码中,您必须自己忽略它们。但是,鉴于输入字符串的性质(布尔条件),您可以安全地删除最后一个元素,因为您的输入字符串将始终以分隔符结尾。

于 2013-08-02T12:08:39.210 回答