正则表达式与群组捕获?

时间:2013-06-27 04:16:34

标签: java regex

我的输入字符串可以是以下格式

   "cust_100dept_200_address_300";
   "cust_100_dept_200_address_300";
   "dept_200_address_300cust_100";
   "address_300cust_100dept_200";

基本上有三个属性,即cust,dept和address,每个属性后跟下划线和一些数字。    序列是灵活的,如我在我的例子中所示,cust_100可以在beginng或middle或者最后。

我想要每个属性的数字(即下划线之后)。所以我的预期输出(无论输入属性的顺序是什么)都是

   group1 = 100
   group2 = 200
   group3 = 300

我在下面试过

  Pattern p = Pattern.compile(
                "cust_(\\d+)" +
                        "dept_(\\d+)" + "address_(\\d+)");
    Matcher m = p.matcher(input);// where input can be anything i stated in the beginning
    if (m.find()) {
      System.out.println("inside while");
      System.out.println("group1 = " + m.group(1));
      System.out.println("group2" + m.group(2));
      System.out.println("group2" + m.group(3));
    }


But i am not getting desired output?

5 个答案:

答案 0 :(得分:2)

我会采用不同的方式

    String g1 = s.replaceAll(".*cust_(\\d+).*", "$1");
    String g2 = s.replaceAll(".*dept_(\\d+).*", "$1");
    String g3 = s.replaceAll(".*address_(\\d+).*", "$1");

答案 1 :(得分:2)

由于各部分之间的下划线,您当前的正则表达式将无法正确匹配前两个示例。对于后两个示例,还有一个单独的问题,即示例中的部分顺序不同。

你最好的选择是将正则表达式的三个不同部分分别作为三个不同的表达式运行。这将允许他们提取细节而不管订单。

以下是另一种更普遍匹配的替代方案。这将允许任何名称/值组合。第一组将是一整个部分(例如“cust_100”),第二组将是“cust”,第三组将是“100”。

((\w+)_(\d+)_?)+

Regular expression image

Edit live on Debuggex

答案 2 :(得分:1)

你可以这样做

String customer=Pattern.compile("(?<=cust_)\\d+").matcher(input).group(0);
String department=Pattern.compile("(?<=dept_)\\d+").matcher(input).group(0);
String address=Pattern.compile("(?<=address_)\\d+").matcher(input).group(0);

答案 3 :(得分:0)

将字符串与+组合在一起就像将它们组合在一起一样。

我建议将此作为3个不同的正则表达式,每个模式一个。

答案 4 :(得分:0)

与其建立3种模式和3种匹配器相比,我相信只使用1种通用模式会更好。请考虑以下代码:

String str = "cust_100_dept_200_address_300"; // your input
Pattern p = Pattern.compile("(?i)(cust|dept|address)_(\\d+)");
Matcherm = p.matcher(str);
Map<String, String> cMap = new HashMap<String, String>();
while (m.find()) {
   cMap.put(m.group(1).toLowerCase(), m.group(2));
}
System.out.printf("cMap: %s%n", cMap);

在所有情况下的输出将是:

cMap: {address=300, dept=200, cust=100}