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}:).*
一样简单。
我在只允许访问整个匹配值的应用程序中使用 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}:).*
一样简单。