正则表达式匹配字符串的可选结尾
给定以下内容:
"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