正则表达式可选匹配

时间:2015-12-01 21:43:36

标签: java regex

将匹配的伪/伪代码:

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(不带单引号),但捕获ABABABAB

迄今为止的最佳尝试:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

请参阅regex demo

故障:

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

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)。没有量词集或内部任何替换的非捕获组似乎是还原剂,可以省略。但是,人们常常被名称​​非捕获误导,认为他们可以从整体匹配中排除此组匹配的子字符串。要在不匹配的情况下检查某些文本的存在与否,应使用环视。因此,我使用了一个前瞻。

实际上,在当前场景中,没有必要进行前瞻,因为如果你需要匹配后续的字符串,那么它就是有意义的。这些子字符串是以相同的字符序列开始的。

所以,更好的选择是

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

爪哇:

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

答案 1 :(得分:2)

以下正则表达式应该可以正常工作

\'([^']+)\'\s+is

所有匹配项都将存储在matcher groups array