【问题标题】:Java pattern matcher group definitionJava 模式匹配器组定义
【发布时间】:2011-06-12 20:43:21
【问题描述】:

我有一个简单的正则表达式,看起来像

([a-z]*)( +[a-z]="[0-9]")*

它适用于匹配模式,如

test a="1" b="2" c="3"...

有没有办法在单独的匹配器组中捕获每个名称-值对(例如,a="1")?

就像在上面的例子中一样,我得到了一个匹配器组(测试),只有一个匹配器组用于 3 个名称-值对(即最后一个,c="3")。我希望有 3 个匹配器组,每个这样的对 1 个。

【问题讨论】:

  • 正则表达式擅长在度假时寻找连环杀手,但并不适合所有事情。如果您有数据协议,也许您应该考虑顺序处理。

标签: java regex


【解决方案1】:

我希望有 3 个匹配器组,每对匹配 1 个。

不,总共是两组。获得三组键值对的唯一方法是:

([a-z]*)( +[a-z]="[0-9]")( +[a-z]="[0-9]")( +[a-z]="[0-9]")

您可以匹配单个组中的所有键值对,然后在其上使用单独的模式和匹配器:

import java.util.regex.*;

public class Main {
  public static void main(String[] args) throws Exception {

    String text = "test a=\"1\" b=\"2\" c=\"3\" bar d=\"4\" e=\"5\"";
    System.out.println(text + "\n");

    Matcher m1 = Pattern.compile("([a-z]*)((?:[ \t]+[a-z]=\"[0-9]\")*)").matcher(text);

    while(m1.find()) {

      System.out.println(m1.group(1));

      Matcher m2 = Pattern.compile("([a-z])=\"([0-9])\"").matcher(m1.group(2));

      while (m2.find()) {
        System.out.println("  " + m2.group(1) + " -> " + m2.group(2));
      }
    }
  }
}

产生:

test a="1" b="2" c="3" bar d="4" e="5"

test
  a -> 1
  b -> 2
  c -> 3

bar
  d -> 4
  e -> 5

【讨论】:

    【解决方案2】:

    使用Matcher#find()方法切换到下一组。

    循环执行,例如:

    Matcher matcher = pattern.matcher(test);
    while (matcher.find()) {
        //extract groups here
    }
    

    【讨论】:

      【解决方案3】:

      我不知道。但是如果你匹配\s+\w="\d",那么你可以多次调用find并单独处理每个匹配。

      【讨论】:

        猜你喜欢
        • 2015-04-28
        • 1970-01-01
        • 2015-01-10
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多