Java 带有组捕获的正则表达式?

Java 带有组捕获的正则表达式?,java,regex,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可以是开始、中间或最后一个 我想要每个属性的数字(

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

   "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可以是开始、中间或最后一个

我想要每个属性的数字(即下划线之后)。因此,我的预期输出(无论输入属性的顺序如何)是

我在下面试过了

  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?

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


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

将字符串与
+
组合与同时运行它们是一样的


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

我会换一种方式做

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

我会换一种方式

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

由于部分之间有下划线,当前正则表达式与前两个示例不匹配。在后两个示例中,还有一个单独的问题,即示例的章节顺序不同

您最好将regex的三个不同部分分别作为三个不同的表达式运行。这将允许他们提取细节,而不考虑顺序

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


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

您最好将regex的三个不同部分分别作为三个不同的表达式运行。这将允许他们提取细节,而不考虑顺序

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

你可以这样做

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);
String customer=Pattern.compile((?您可以这样做

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);

“代码> StrueCuff=模式。编译(”(?< P>而不是构建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);

不要建立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);

这是如何解决提问者的问题的?请将此作为评论发布。这是如何解决提问者的问题的?请将此作为评论发布。属性的顺序是灵活的!问题中发布的示例没有设置顺序。“cust”、“dept”和“address”可以以任何顺序显示。属性的顺序是fle灵活!问题中的示例没有设置顺序。“cust”、“dept”和“address”可以以任何顺序出现。没有方法组()将字符串作为参数放在匹配器中。因此例外情况是“类型匹配器中的方法组(int)不适用于参数(字符串)”@来自Java7Regex的Emily支持命名组,所以您可能正在使用一些早期版本version@Anirudh您不应该将字符串与
!=
进行比较。请使用
equals
方法,如
!“”。equals(m.group(“cust”)
或来自Java7的
isEmpty()
没有方法组()它将字符串作为参数undet Matcher。所以例外情况是“类型Matcher中的方法组(int)不适用于参数(字符串)”@Emily来自Java7正则表达式,支持命名组,所以可能您使用的是更早的方法组version@Anirudh您不应该将字符串与
!=
进行比较。请使用
等于
的方法,如
!“”.equals(m.group(“cust”))
或来自Java7
isEmpty()