0

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

   "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 可以出现在开头或中间或最后。

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

   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?
4

5 回答 5

2

我会以不同的方式做

    String g1 = s.replaceAll(".*cust_(\\d+).*", "$1");
    String g2 = s.replaceAll(".*dept_(\\d+).*", "$1");
    String g3 = s.replaceAll(".*address_(\\d+).*", "$1");
于 2013-06-27T04:22:50.750 回答
2

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

您最好的选择是将正则表达式的三个不同部分分别作为三个不同的表达式运行。这将允许他们提取详细信息,而不管顺序如何。

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

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

正则表达式图片

在 Debuggex 上实时编辑

于 2013-06-27T04:30:54.927 回答
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);
于 2013-06-27T04:31:23.887 回答
0

我相信你最好只使用 1 个通用模式,而不是构建 3 个模式和 3 个匹配器。考虑以下代码:

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}
于 2013-06-27T06:01:14.833 回答
0

将字符串组合在一起与+将它们一起运行是一样的。

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

于 2013-06-27T04:19:37.523 回答