【问题标题】:Regular expression capture groups which is in a group正则表达式捕获组中的组
【发布时间】:2010-12-27 07:22:44
【问题描述】:

在 Java 中,如何获取组内的所有组(正则表达式)。
例如:使用 (([A-Z][a-z]+)+)([0-9]+) 测试一个字符串:“AbcDefGhi12345”。
然后得到结果:
匹配():是
groupCount():3
组(1):AbcDefGhi
组(2):Ghi
组(3):12345

但我想分别获取字符串“Abc”、“Def”、“Ghi”、“12345”。
如何使用正则表达式做到这一点?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    正则表达式无法处理重复组,它可以返回任何捕获的组(在您的情况下,它返回"Ghi")。

    下面的例子将打印出来:

    Abc
    Def
    Ghi
    12345
    

    代码:

    public static void main(String[] args) {
    
        String example = "AbcDefGhi12345";
    
        if (example.matches("(([A-Z][a-z]+)+)([0-9]+)")) {
    
            Scanner s = new Scanner(example);
    
            String m;
            while ((m = s.findWithinHorizon("[A-Z][a-z]+", 0)) != null)
                System.out.println(m);
    
            System.out.println(s.findWithinHorizon("[0-9]+", 0));
        }
    }
    

    【讨论】:

    • camelCaseStyle 是否定义了每个组?
    • @pringlesinn:是的(词组)。
    • @dacwe:所以也许我刚才问的可能会帮助stackoverflow.com/questions/4502273/…
    • -1 如果您复制我(和 hzh 的)答案,您应该提及它,而不是添加它不起作用的评论。
    • RE 引擎可能会返回匹配每个组的第一个位置。在这种情况下产生的内容没有实际的规范(无论如何,这在 RE 匹配器级别是非常黑的艺术)。
    【解决方案2】:
    Pattern p = Pattern.compile("([A-Z][a-z]+|(?:[0-9]+))");
    Matcher m = p.matcher("AbcDefGhi12345");
    while(m.find()){
       System.out.println(m.group(1));
    }
    

    【讨论】:

    • 如果匹配不以[A-Z][a-z]+开头的字符串是好的,这是最好的解决方案!
    【解决方案3】:

    喜欢 hzh 的回答,格式有点简单:

    Pattern p = Pattern.compile("[A-Z][a-z]+|[0-9]+"); 
    Matcher m = p.matcher("AbcDefGhi12345"); 
    while(m.find()){ 
        System.out.println(m.group(0)); 
    }
    

    给你

    Abc
    Def
    Ghi
    12345
    

    【讨论】:

    • 不正确,当我运行它时,我得到以下信息:1. Abc 2. Def 3. Ghi 4. 12345
    • 是的,它仍然单独匹配字符串“12345”,这是好的。
    • 为什么不行??? OP 从不要求它只匹配某种格式的字符串。并为此给我一个-1...嗯。
    • 如果是这样,当然会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 2021-06-01
    • 2018-09-08
    相关资源
    最近更新 更多