假设我有这个正则表达式:
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);
}
这仅适用于模式正在处理的文本实际上具有年龄部分的情况,如果没有,则会弹出错误。那么如何捕捉不确定的群体?
答案 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"
将产生:
EMMA
21
将正则表达式放入Java源代码中的字符串时,不要忘记将反斜杠加倍。