说我有正则表达式:
(CC|NP)*
因此,它会在 Java 中的前瞻正则表达式中产生问题。我该如何写才能避免这些问题?我想把它重写为:
(CC|NP){1,9}
在 regexr 上测试似乎完全忽略了上限。 在 Java 中,这些量 {} 似乎只适用于非组正则表达式元素,如:
\w+\[\S{1,9}\]
说我有正则表达式:
(CC|NP)*
因此,它会在 Java 中的前瞻正则表达式中产生问题。我该如何写才能避免这些问题?我想把它重写为:
(CC|NP){1,9}
在 regexr 上测试似乎完全忽略了上限。 在 Java 中,这些量 {} 似乎只适用于非组正则表达式元素,如:
\w+\[\S{1,9}\]
我不确定您在哪里发现问题。量词像任何实体一样作用于组。
所以,\w+\[\S{1,9}\]
本来可以写成\w+\[(\S){1,9}\]
同样的结果。
就您在 regexr 上的示例而言,那里没有任何问题。它符合它应该的。
(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}
抱歉,后面的模式通常对子模式有限制。请参阅 fx为什么在某些情况下,lookbehind 中的有限重复不起作用?p。或在网络上搜索“lookbehind 模式限制”。
您可以尝试将后视模式的所有固定长度变体写成交替模式。但这可能是很多...
您还可以通过通常匹配内部模式并匹配和分组您的实际目标来模拟后视:(?:CC|NP)*(.*)