String s1 = "NetworkElement=Test,testWork=1:[456]";
String s2 = "NetworkElement=Test,testWork=1";
String regex = "(.*):\[(.*)\]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s1);
if (matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
}
Matcher matcher2 = pattern.matcher(s2);
if (matcher2.find()) {
System.out.println(matcher2.group(1));
System.out.println(matcher2.group(2));
}
/*
Expected output:
for s1 : NetworkElement=Test,testWork=1
456
for s2 : NetworkElement=Test,testWork=1
0
*/
问题:这个正则表达式是工作良好的字符串s1,但不是s2。对于字符串s2, matcher2.find()返回false。
可以使用
^(.*?)(?::[(.*?)])?$
^(.*?)(?::[([^][]*)])?$
参见regex演示。
Java:
String regex = "^(.*?)(?::\[(.*?)])?$";
// Or
String regex = "^(.*?)(?::\[([^\]\[]*)])?$";
我添加了^
和$
锚,因为您使用的是matcher.find()
。如果您切换到matcher.matches()
,您可以删除锚。
细节:
^
-起始字符串(.*?)
-组1:除换行符外的任何零或多个字符尽可能少(?::[(.*?)])?
-:[
的可选序列,然后组2捕获除换行符以外的任何零个或多个字符,然后是]
字符(如果您使用[^][]*
,它将匹配除方括号以外的零个或多个字符)$
-字符串结束