Java正则表达式查找不起js正则表达式查找的作用



我的目标是:

给定字符串:"Part1-part2-part3-part4-part5"
在第二次出现"-"时拆分它,
所以我期望一个数组[ "Part1-part2", "part3-part4-part5" ]

我做了什么:

"Part1-part2-part3-part4-part5".split("(?<=^\w+-\w+)-"

但是jdk 8上的结果:
它找不到第二个'-'的匹配项,并返回整个字符串
证据:https://ideone.com/myWppm

但是,当我尝试在线regex处理网站和node.js(或chrome([相信我,modern js支持lookbacking]时,结果如预期
证据:https://ideone.com/ttQWNr

我现在正在使用的破解(不符合解决方案的条件(:

使用前向而非后向,从末尾开始第三次出现"-">
"Part1-part2-part3-part4-part5".split("-(?=\w+-\w+-\w+$)");

Java确实支持使用量词的有限查找,例如{0,100}

要匹配除连字符之外的任何字符,可以使用[^-],它是一个否定字符类。

如果您想排除匹配的换行符,可以将其扩展到[^-\r\n]

您可以使用:

(?<=^[^-]{0,100}-[^-]{0,100})-

部件内

  • (?<=正面向后看,断言左边的是
    • ^字符串开始
    • [^-]{0,100}-匹配0-100倍除-以外的任何字符,然后匹配第一个-
    • [^-]{0,100} Match 0 - 100 times any char except-`
  • )密切关注
  • -匹配第二个要拆分的-

Regex演示| Java演示

例如

System.out.println(
Arrays.toString(
"Part1-part2-part3-part4-part5".split("(?<=^[^-]{0,100}-[^-]{0,100})-")
)
);

输出

[Part1-part2, part3-part4-part5]

不使用split(),而是使用匹配:

String input = "Part1-part2-part3-part4-part5";
String regex = "(\w+-\w+)-(.*)"
String[] result; // just to simulate result of split()
Matcher m = Pattern.compile(regex).matcher(input);
if (m.matches()) {
result = new String[] { m.group(1), m.group(2) };
} else {
result = new String[] { input };
}

当然,这是更多的代码,但您可以轻松地增强正则表达式以执行更多的验证,例如,除了-(显然还有_(之外,没有其他特殊字符,即使是第二个短划线之后的文本。

Java不支持可变宽度的lookbehinds。假设您的输入字符串总是有五个连字符分隔的项,我们可以通过在spltting之前检查前面是否有两个连字符来表达拆分逻辑:
String input = "Part1-part2-part3-part4-part5";
String[] parts = input.split("-(?=[^-]+-[^-]+-[^-]+$)");
System.out.println(Arrays.toString(parts));

此打印:

[Part1-part2, part3-part4-part5]

最新更新