gpt4 book ai didi

java - 复杂的lookbehind中的无限量词

转载 作者:行者123 更新时间:2023-12-02 08:00:15 25 4
gpt4 key购买 nike

我在编写这个正则表达式时遇到了很多麻烦:

(?<=\s+|^\s*|\(\s*|\.)(?:item|item1|item2)(?=\s+|\s*$|\s*\)|\.)

它在我的正则表达式编辑器 (Expresso) 和 .NET 环境中工作得很好,但在 Java 环境(使用 Eclipse Helios R2 的 JRE 1.6.0.25)中它不起作用,因为 Pattern.compile()方法抛出“语法错误 U_REGEX_LOOK_BEHIND_LIMIT”异常。

那是因为背后的模式 (?<=\s+|^\s*|\(\s*|\.)必须有一个定义的限制(据我所知,这里不允许使用无限制的量词,例如 *+)。

我也尝试以这种方式指定重复范围,但没有成功:

(?<=\s{0,1000}|^\s{0,1000}|\(\s{0,1000}|\.)(?:item|item1|item2)(?=\s+|\s*$|\s*\)|\.)

那么,我怎样才能编写一个在 Java 环境下也能工作的相同正则表达式呢?我不敢相信这种常见情况没有解决方法......

最佳答案

请记住,向后查找只会向后查找所需的距离。例如,(?<=\s+)如果前一个字符是空格,则满足;它不需要再往前看。

你的后视也是如此。如果它不是字符串的开头,并且前一个字符不是空格、左括号或句点,则没有必要再往前看。它相当于这样:

(?<=^|[\s(.])

你的前瞻可以用同样的方式压缩。如果它不是字符串的结尾,并且下一个字符不是空格、右括号或句点,则没有必要进一步查找:

(?=[\s).]|$)

所以最终的正则表达式是:

(?<=^|[\s(.])(?:item|item1|item2)(?=[\s).]|$)

关于java - 复杂的lookbehind中的无限量词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8994153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com