Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';s Matcher.group(int)方法避免匹配括号内的子括号的内容_Java_Regex Group_Matcher - Fatal编程技术网

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
    相同