gpt4 book ai didi

java - 正则可选匹配

转载 作者:行者123 更新时间:2023-11-29 03:02:24 27 4
gpt4 key购买 nike

将匹配的伪/虚拟代码:

RECOVERY: 'XXXXXXXXX' is UP
PROBLEM: 'ABABABAB' on 'XXXXXXXXX' is WARNING
PROBLEM: 'XXXXXXXXX' is DOWN
RECOVERY: 'ABABABAB' on 'XXXXXXXXX' is OK
PROBLEM: 'ABABABAB' on 'XXXXXXXXX' is DOWN

目标

捕获XXXXXXXXX(没有单引号)但NOT捕获ABABABAB

迄今为止的最佳尝试:

(M: \'|Y: \')(.*)(?:\' )(?:is)

是否有可能实现上述目标,如果有,那么如何实现?

最佳答案

您只能使用前瞻来检查匹配的字符串是否在之前:

'([^']*)'\\s*(?=\\bis\\b)

参见 regex demo

分割:

  • ' - 单撇号
  • ([^']*) - 捕获组匹配除 '
  • 之外的 0 个或多个字符
  • '\\s* - 一个撇号和 0 个或多个空白符号
  • (?=\\bis\\b) - 确保在当前位置之后(在 ' 带有可选的空格)

Java demo :

Pattern ptrn = Pattern.compile("'([^']*)'\\s*(?=\\bis\\b)");
Matcher matcher = ptrn.matcher("RECOVERY: 'XXXXXXXXX' is UP");
if (matcher.find()) {
System.out.println(matcher.group(1));
}

更新

我使用前瞻只是因为你使用了 non-capturing group在你原来的正则表达式中:(?:is)。没有量词集或内部没有任何交替的非捕获组似乎是多余的,可以省略。然而,人们经常被 non-capturing 这个名字误导,认为他们可以从整体匹配中排除该组匹配的子串。要在不匹配的情况下检查是否存在某些文本,应使用环视。因此,我使用了前瞻。

事实上,在当前情况下,没有必要进行前瞻,因为如果您需要匹配以相同字符序列开头的后续子字符串,它是有意义的。

所以,一个更好的选择是

'([^']*)'\s*is\b

Java:

Pattern ptrn = Pattern.compile("'([^']*)'\\s*is\\b");

关于java - 正则可选匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34030762/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com