Java和JS中的正则表达式行为不同?
我对JavaScript正则表达式匹配有一个大问题: 在Java端,正则表达式拆分表达式的行为与JS端不同。我把它简化为下面的例子,也许你知道根本原因 测试字符串:Java和JS中的正则表达式行为不同?,java,javascript,regex,gwt,Java,Javascript,Regex,Gwt,我对JavaScript正则表达式匹配有一个大问题: 在Java端,正则表达式拆分表达式的行为与JS端不同。我把它简化为下面的例子,也许你知道根本原因 测试字符串: 测试==1 我希望==1匹配(稍后我会将其用作拆分器,但这与我的问题无关) 精简正则表达式: ([=\s]+).*(?:[=]|\z)+ java端的结果()匹配:==1 JS端()的结果匹配:=和= 为什么??如何使regex JS的行为与Java端相同?JavaScript不支持\A开始和\Z结束字符串锚定,因此被迫在=上结束匹
测试==1
我希望==1
匹配(稍后我会将其用作拆分器,但这与我的问题无关)
精简正则表达式:
([=\s]+).*(?:[=]|\z)+
java端的结果()匹配:==1
JS端()的结果匹配:=
和=
为什么??如何使regex JS的行为与Java端相同?JavaScript不支持
\A
开始和\Z
结束字符串锚定,因此被迫在=
上结束匹配。改用$
线端锚点
编辑:那里也只有一场比赛。如果查看并添加
警报(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);//["== 1", "=="]
var s=“匹配位置”+m.index+“:\n”;
对于(i=0;i
m[0]
提供实际匹配(就像Java中的Matcher#group(0)
一样)和m[1]
第一组捕获
EDIT:(Java和JavaScript的String.split()方法之间的差异)
- 与Java不同,JavaScript的split()返回结果数组中分隔符regex中指定的所有捕获组。因此,您需要将您的第一个正则表达式组设置为非捕获的
(?:[&=\\s]+)?
- 使用Java的split()方法,结果数组中不包括尾随的空字符串。在JavaScript代码中,您必须自己忽略它们。但是,考虑到输入字符串的性质(布尔条件),您可以安全地删除最后一个元素,因为输入字符串总是以分隔符结尾
确定,使用([=\s]+).*(?:[=]|$)+
修复行尾的问题。但是更进一步:为什么我在JS中得到2个匹配,在Java中我只需要1个匹配?也许我做的拆分是错误的?我想使用正则表达式将字符串拆分为令牌,匹配项应该充当动态除名器。看着,我看到我得到了。split[]:[0]:test,[1]:=,[2]:1
。但是我只想要测试。为什么我得到3个结果,而不仅仅是测试
字符串?您试图在这里拆分的完整输入字符串是什么?如果它很长,只需要组成一个覆盖所有分隔符的字符串。我的字符串看起来像test1==1&&test2==2
,我想在这里提取test1
和test2
。在Java中,我只需使用REGEX=([&=\\s]+)?[=]+?*(?:[&=]].$)+
运行value.split(REGEX)
。这只会给我一个长度为2的数组,但在JS中这不起作用…@membersound,请检查更新。Java和JavaScript的String.split()
方法在工作方式上有一些细微的差异。