您可以将第一个
.+懒惰的人变成懒惰的人,然后用一个非捕获的可选组来包裹后面的部分:
(.+?)(?: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)); }}


