使用Java和regex,我如何捕获不确定的(?)组?

时间:2016-01-06 17:50:17

标签: java regex

假设我有这个正则表达式:

reduce() arg 2 must support iteration

捕获名称非常简单,我只想写下这样的东西:

Hello\smy\sname\sis((PETER)|(HARRY)|(EMMA))(and\smy\sage\sis(\d+))?

...

然而对于这个年龄:

if(matcher.group(1).equals(matcher.group(2)) {
  String str = matcher.group(2);
}

这仅适用于模式正在处理的文本实际上具有年龄部分的情况,如果没有,则会弹出错误。那么如何捕捉不确定的群体?

2 个答案:

答案 0 :(得分:2)

如果输入字符串中不存在可选组,则group方法将返回null。因此,NullPointerException语句中可能会引发if。而是检查matcher.group(5)是否为null

答案 1 :(得分:2)

你的正则表达式有点奇怪。我假设你只想捕捉名字和年龄。没有理由在每个单独的名称周围加上括号,或者使可选的第二部分成为捕获组(除非你需要看到句子的整个部分,而不仅仅是年龄本身;但是年龄是唯一的可以变化的部分,其余部分是常量字符串)。

此外,这个正则表达式不可能在名称之前或之后放置一个空格,这是奇怪的。我想你会想要这样的正则表达式:

Hello\smy\sname\sis\s(PETER|HARRY|EMMA)(?:\sand\smy\sage\sis\s(\d+))?

请注意,通过将?:放在左括号后面,第二个已成为非捕获组。如果未提供后半部分,则名称将为组1,组2将为null,否则将包含年龄的数字。

例如,"Hello my name is EMMA and my age is 21"将产生:

  • 第1组:EMMA
  • 第2组:21

将正则表达式放入Java源代码中的字符串时,不要忘记将反斜杠加倍。