Java';s Matcher.group(int)方法避免匹配括号内的子括号的内容
我有一根像Java';s Matcher.group(int)方法避免匹配括号内的子括号的内容,java,regex-group,matcher,Java,Regex Group,Matcher,我有一根像 String str = "美国临时申请No.62004615"; 和一个正则表达式一样 String regex = "(((美国|PCT|加拿大){0,1})([\\u4E00-\\u9FA5]{1,8})((NO.|NOS.){1})([\\d]{5,}))"; 其他代码是 Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.ma
String str = "美国临时申请No.62004615";
和一个正则表达式一样
String regex = "(((美国|PCT|加拿大){0,1})([\\u4E00-\\u9FA5]{1,8})((NO.|NOS.){1})([\\d]{5,}))";
其他代码是
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println("1:"+matcher.group(1)+"\n"
+"2:"+matcher.group(2)+"\n"
+"3:"+matcher.group(3)+"\n"
+"4:"+matcher.group(4)+"\n"
+"5:"+matcher.group(5)+"\n"
+"6:"+matcher.group(6)+"\n"
+"7:"+matcher.group(7));
}
我知道括号()用于对正则表达式短语进行分组。第一组是大组
第二组是((美国|PCT|加拿大){0,1})以匹配“美国" 或“PCT”或加拿大“
第三组是([\u4E00-\u9FA5]{1,8}),以匹配长度为1到8的汉字
第四组是((编号| NOS.){1})以匹配编号。
第五组是([\d]{5,})以匹配该数字
但控制台是
1:美国临时申请No.62004615 2:美国 3:美国 4:临时申请 5:No. 6:No. 7:62004615
组(2)与组(3)相同。组(5)与组(6)相同
第(3)组似乎重新匹配了括号内的子括号。我想知道是否有办法只匹配最外层的括号
理想的结果应该是
1:美国临时申请No.62004615 2:美国 3:临时申请 4:No. 5:62004615
听起来您需要一个非捕获组。发件人:
(?:
X)
X,作为非捕获组
因此,改变这一点:
(美国|PCT|加拿大)
为此:
(?:美国|PCT|加拿大)
…然后它将不会在Matcher中表示为一个组
一些旁注:
与编写{0,1}
相同?
什么都不做,可以完全删除{1}
与[\\d]
相同\\d
(?:
X)
X,作为非捕获组
因此,改变这一点:
(美国|PCT|加拿大)
为此:
(?:美国|PCT|加拿大)
…然后它将不会在Matcher中表示为一个组
一些旁注:
与编写{0,1}
相同?
什么都不做,可以完全删除{1}
与[\\d]
相同\\d