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”))
或来自Java7isEmpty()