0

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

(?<=\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*|\.)无限量词,例如*and )。+

我还尝试以这种方式指定重复范围,但没有运气:

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

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

4

1 回答 1

2

请记住,向后看只会尽可能远地向后看。例如,(?<=\s+)如果前一个字符是空格则满足;它不需要再往后看。

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

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

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

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

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

(?<=^|[\s(.])(?:item|item1|item2)(?=[\s).]|$)
于 2012-01-25T01:16:57.937 回答