Java 量词的正则表达式回溯问题

Java regex lookbehind issue with quantifiers

我在只允许访问整个匹配值的应用程序中使用 Java 正则表达式模式(也就是说,我不能使用捕获组)。

我正在尝试从示例文本中提取值:

C02 SURVEY  : 2010 F10446P BONAPARTE 2D 

在上面的示例中,我需要检查关键字 SURVEY 并且必须在 : 之后提取值。我希望我的输出是:

2010 F10446P BONAPARTE 2D

我使用了模式(?<=(?i)survey\s{2}[:])(?:(?![\n]).)*

在此模式中,我已将空格硬编码为 2 (\s{2}),这可能会有所不同而不是恒定值。

我需要在后向操作中使用量词。

如果还有其他选择,请告诉我。

您可以利用 Java 正则表达式引擎中称为 "constrained width lookbehind":

的功能

Java accepts quantifiers within lookbehind, as long as the length of the matching strings falls within a pre-determined range. For instance, (?<=cats?) is valid because it can only match strings of three or four characters. Likewise, (?<=A{1,10}) is valid.

这意味着,您可以将 {2} 限制量词替换为具有最小值和最大值的限制量词,例如{0,100} 允许零到一百个空白符号。根据需要调整它们。

此外,您不需要使用经过调节的贪婪标记 (?:(?![\n]).)*,因为 Java 正则表达式中的点与换行符不匹配。只需将其替换为 .* 即可匹配换行符以外的任何零个或多个字符。因此,您的模式可能看起来像 (?i)(?<=survey\s{0,100}:).* 一样简单。