我有这个目标:
给定字符串:"Part1-part2-part3-part4-part5"
在第二次出现“-”时拆分它,
所以我期待一个数组 [ "Part1-part2", "part3-part4-part5"]
我做了什么:
"Part1-part2-part3-part4-part5".split("(?<=^\\w+-\\w+)-"
但是在 jdk 8 上的结果:
它没有找到第二个 '-' 的匹配项,并返回整个字符串。
证据:https://ideone.com/myWppm
但是当我尝试在线正则表达式处理网站和 node.js(或 chrome)[相信我,现代 js 支持 lookbehind] 时,结果符合预期。
证据:https://ideone.com/ttQWNr
我现在正在使用的 Hack(没有资格成为解决方案):
使用先行而不是后行,从末尾第 3 次出现“-”
"Part1-part2-part3-part4-part5".split("-(?=\\w+-\\w+-\\w+$)");
最佳答案
Java 确实支持使用量词的有限后视,例如 {0,100}
要匹配除连字符以外的任何字符,您可以使用 [^-]
这是一个 negated character class .
如果你想排除匹配的换行符,你可以将它扩展到 [^-\\r\\n]
您可能会使用:
(?<=^[^-]{0,100}-[^-]{0,100})-
部分
-
(?<=
正向后视,断言左边的是-
^
字符串开始 -
[^-]{0,100}
- 匹配任何字符的 0 到 100 次,除了-
, 然后匹配第一个-
-
[^-]{0,100} Match 0 - 100 times any char except
-`
-
-
)
近距离观察 -
-
匹配第二个-
拆分
例如
System.out.println(
Arrays.toString(
"Part1-part2-part3-part4-part5".split("(?<=^[^-]{0,100}-[^-]{0,100})-")
)
);
输出
[Part1-part2, part3-part4-part5]
关于Java regex lookbehind 不能像 js regex lookbehind 那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61168423/