正则表达式匹配字符串的可选结尾

给定以下内容:

"John Smith"

"John Smith (123)"

"John Smith (123) (456)"

我想捕捉:

"John Smith"

"John Smith", "123"

"John Smith (123)", "456"

什么Java正则表达式可以让我做到这一点?

我已经尝试过了(.+)\s\((\d+)\)$,它对于“约翰·史密斯(123)”和“约翰·史密斯(123)(456)”都适用,但是对“约翰·史密斯”却不起作用。如何更改正则表达式以使其也可用于第一个输入?

回答:

您可以将第一个.+懒惰的人变成懒惰的人,然后用一个非捕获的可选组来包裹后面的部分:

(.+?)(?:\s\((\d+)\))?$

^ ^^^ ^^

参见正则表达式演示

实际上,如果将正则表达式与String#matches()最后一个一起使用$是多余的。

详细资料

  • (.+?) -组1捕获除换行符以外的一个或零个字符,并且尽可能少(因此,允许随后的子模式“落入”组)
  • (?:\s\((\d+)\))?-可选的空格序列(,第2组捕获1个以上的数字和一个)
  • $ -弦锚的末端。

一个Java的演示:

String[] lst = new String[] {"John Smith","John Smith (123)","John Smith (123) (456)"};

Pattern p = Pattern.compile("(.+?)(?:\\s\\((\\d+)\\))?");

for (String s: lst) {

Matcher m = p.matcher(s);

if (m.matches()) {

System.out.println(m.group(1));

if (m.group(2) != null)

System.out.println(m.group(2));

}

}

以上是 正则表达式匹配字符串的可选结尾 的全部内容, 来源链接: utcz.com/qa/407630.html

回到顶部