Java regex lookbehind 不能像 js regex lookbehind 那样工作

标签 java regex regex-lookarounds lookbehind

我有这个目标:

给定字符串:"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 -`
  • )近距离观察
  • -匹配第二个 -拆分

Regex demo | Java demo

例如

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/

相关文章:

java - 用于匹配 mp3 URL 的正则表达式

java - 如何配置Tomcat7生产服务器?

java - 如何获取 StackOverflowError 的完整堆栈

javascript - 在 Jquery 中使用 Match 只返回一个值

javascript - 如何在 JavaScript 的开关中测试正则表达式的结果

python - 用于在所有空格处拆分的正则表达式 Python

javascript - 如何编写正则表达式来匹配 Javascript 对象名称?

java - 如何获取场景上的元素JavaFX/动态添加对象到场景

JAVA:使用 DecimalFormat 时遇到问题?需要 30.40 而不是 30.4

正则表达式最多替换单词前的 4 位数字