Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和JS中的正则表达式行为不同?_Java_Javascript_Regex_Gwt - Fatal编程技术网

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结束字符串锚定,因此被迫在=上结束匹

我对JavaScript正则表达式匹配有一个大问题: 在Java端,正则表达式拆分表达式的行为与JS端不同。我把它简化为下面的例子,也许你知道根本原因

测试字符串:
测试==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()
方法在工作方式上有一些细微的差异。