我如何使一个正则表达式部分可选,并在同一点完成正则表达式,如果该可选部分包含字符串结束($)?


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捕获除换行符以外的任何零个或多个字符,然后是]字符(如果您使用[^][]*,它将匹配除方括号以外的零个或多个字符)
  • $-字符串结束

相关内容

  • 没有找到相关文章

最新更新