【问题标题】:Regex and capturing parenthesis正则表达式和捕获括号
【发布时间】:2015-01-20 02:39:31
【问题描述】:

我正在尝试了解如何为正则表达式捕获括号,但我不明白......

我的代码是:

   Pattern pattern = Pattern.compile("ab");
   Matcher m = pattern.matcher("abc");

  while (m.find()) { 
      for (int i = 0; i < m.groupCount(); i++) {
          System.out.println(m.group(i));
      }
  }

所以我根本没有显示。 我的理解是我需要一个捕获括号来记住匹配结果并显示它。

所以我做到了:

   Pattern pattern = Pattern.compile("(ab)");
   Matcher m = pattern.matcher("abc");

我得到了预期的显示:ab

然后我想记住并只显示匹配结果的一部分,所以我做到了:

   Pattern pattern = Pattern.compile("(a)b");
   Matcher m = pattern.matcher("abc");

我期待有:a,但我有:ab

为什么?

【问题讨论】:

    标签: java regex parentheses capturing-group


    【解决方案1】:

    来自Matcher#group()的javadocs:

    捕获组从左到右编入索引,从一个开始。第 0 组表示整个模式,因此表达式 m.group(0) 等价于 m.group()。

    问题在于组零(即m.group(0))匹配整个模式,而不是括号内的那个。所以要匹配你想要的组,你需要从索引 1 开始,直到组数结束:

    for (int i = 1; i <= m.groupCount(); i++) {
        System.out.println(m.group(i));
    }
    

    就您而言,您只有一组。但是如果你有类似Pattern.compile("(a)(b)") 的东西,那么(a) 将匹配组 1,(b) 将匹配组 2。

    【讨论】:

    • 感谢您的回答!
    猜你喜欢
    • 2012-04-13
    • 2013-10-31
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多