开发者社区> 问答> 正文

Java的Matcher.group(int)方法如何避免匹配括号内子括号的内容

我有一个像

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的汉字。
第四组是((NO。| NOS。){1})以匹配NO。或NOS。第五组是([\ 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


问题来源:Stack Overflow

展开
收起
montos 2020-03-22 17:23:14 741 0
1 条回答
写回答
取消 提交回答
  • 听起来好像您想要一个非捕获组。从Pattern文档中:

    (?:X ) X,作为非捕获组

    因此,更改此:

    (美国|PCT|加拿大) 对此:

    (?:美国|PCT|加拿大) …然后在Matcher中根本不会将其表示为一个组。

    一些注意事项:

    • {0,1}和写作一样?。
    • {1} 什么也不做,可以完全删除。
    • [\d]和一样\d。

    回答来源:Stack Overflow

    2020-03-22 17:24:27
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载