3

我想在 java 中使用负前瞻,但我不能仅将它应用于文本的某些部分。它从光标处一直使用到结尾。有可能以某种方式做到吗?

一个例子:我有一个不定的'ab'围绕它的字符串:ababJJJababab

我希望只对没有“ab”的中心部分进行分组(即 JJJ)。所以这是我的正则表达式:

^(?:ab)*((?!.*ab.*).*)(?:ab)*$

问题是负前瞻超出了它的容器组并试图避免'ab'直到文本结束(这将导致根本找不到任何匹配项)。请注意,我的实际问题要复杂得多,我并不是在寻找解决这个特定示例的方法。有没有办法分配某种边界来定义正则表达式中的前瞻范围,避免将其应用于文本的其余部分?

提前致谢 ...

4

2 回答 2

2

在这种特定情况下,最小匹配应该有效。但是,在一般情况下,您需要这样的东西:

(?sx)
(?:abc) ( (?: (?!abc) .)* ) (?:abc)

我也不相信你在第一部分和最后一部分的所有明星。您意识到您的模式与空字符串匹配,不是吗?

于 2013-02-23T15:06:15.077 回答
1

在这种特殊情况下,您根本不需要负前瞻。您只需要使中间量词不贪婪,这样它就不会消耗尾随的“ab”:

^(?:ab)*(.*?)(?:ab)*$
于 2013-02-23T14:27:21.343 回答