假设我有正则表达式:
(CC|NP)*
因此,它在 Java 中的前看正则表达式中产生了问题。我该怎么写才能避免这些问题?我想把它改写为:
(CC|NP){1,9}
在正则表达式上进行测试似乎完全忽略了上限。在Java中,这些量词{}似乎只适用于非组正则表达式元素,如下所示:
w+[S{1,9}]
抱歉,查看模式背后通常对子模式有限制。见f.x.为什么回溯中的有限重复在某些口味中不起作用?或者在 Web 上搜索"后瞻模式限制"。
您可以尝试将外观背后的图案的所有固定长度变体写为交替图案。但这可能是很多...
您还可以通过正常匹配内部模式来模拟后视,并匹配和分组您的实际目标:(?:CC|NP)*(.*)
我不确定你在哪里察觉到这个问题。量词像任何实体一样作用于组。
因此,w+[S{1,9}]
本可以w+[(S){1,9}]
编写相同的结果。
就您在正则表达式上的示例而言,那里没有任何损坏。它符合它应该做的事情。
(PUN|CC|NP){1,3}
会贪婪地尝试匹配任何交替(从左到右的优先级)。它将匹配的内容不会中断。它匹配 1-3 次连续出现的 PUN 或 CC 或 NP。
您提供的示例字符串在 CC 之间有一个空格,因此由于正则表达式中不存在空格,因此不匹配。唯一匹配的是单个CC
。
如果要考虑一个空格,可以像这样将其添加到分组中:
(?:(?:PUN|CC|NP)s*){1,3}
如果你只想在交替之间允许空格,可以这样完成:
(?:PUN|CC|NP)(?:s*(?:PUN|CC|NP)){0,2}