假设我有这个正则表达式:
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);
}
..。
然而,就年龄而言:
if(!matcher.group(5).isEmpty()) {
int age = matcher.group(6);
}
只有当模式正在处理的文本实际上有年龄部分时才能工作,如果没有,则会弹出一个错误。那么我怎样才能捕捉到这个不确定的群体呢?
发布于 2016-01-06 09:59:45
如果输入字符串中不存在可选组,则group
方法将返回null
。因此,可能会在NullPointerException
语句中抛出一个if
。相反,请检查matcher.group(5)
是否为null
。
发布于 2016-01-06 10:46:11
你的判断力有点奇怪。我想你只想知道名字和年龄。没有理由在每个名字周围加上括号,也没有理由让可选的第二部分成为捕获组(除非您需要看到句子的整个部分,而不仅仅是年龄本身;但年龄是唯一可以改变的部分,其余部分是一个常量字符串)。
而且,这个正则表达式不可能在名称之前或后面放置一个空格,这是很奇怪的。我想你会想要像这样的正则表达式:
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源代码中将正则表达式放入字符串时,不要忘记将反斜杠加倍。
https://stackoverflow.com/questions/34639504
复制