在Java正则表达式中,是否可以定义前瞻的范围?

3

我想在Java中使用负向先行断言,但我无法仅将其应用于文本的某些部分。它从光标处到结尾使用。有办法可以解决吗?

示例: 我有一个包含不定数量“ab”的字符串:ababJJJababab

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

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

问题在于负向先行断言超出了其容器组,试图避免直到文本末尾的 'ab'(这将导致根本找不到任何匹配项)。 请注意,我的实际问题更加复杂,我不是在寻找这个特定示例的解决方法。是否有一种方式来分配某种边界,以定义正则表达式中先行断言适用的范围,并避免其应用于文本的余下部分? 提前感谢...

除非您知道应该停止的点的某些属性,否则无法限制范围。 - nhahtdh
2个回答

2
在这种特定情况下,最小匹配应该可以解决问题。然而,在一般情况下,您需要像这样的东西:
(?sx)
(?:abc) ( (?: (?!abc) .)* ) (?:abc)

我也不信任你在开头和结尾的所有星号。你知道你的模式匹配空字符串了吗?


1
在这种特定情况下,您根本不需要使用负向先行断言。您只需要使中间的量词变为非贪婪模式,这样它就不会消耗尾随的 "ab":
^(?:ab)*(.*?)(?:ab)*$

谢谢,我之前不了解Java中的量词概念:在这里阅读相关内容 - Nerssi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接