使用正则表达式匹配分隔列表中的子字符串

时间:2015-12-03 15:02:54

标签: java regex string matcher

我试图在Java中制定一个正则表达式,以在空格分隔的列表中捕获多个字符串。这是我想要捕获的字符串......

String output = "regulations { qux def } standards none rules { abc-123 456-defghi wxyz_678  } security { enabled }";

我希望使用正则表达式匹配紧跟在rules之后的括号之间的空格分隔列表中的每个单词。换句话说,我希望正则表达式匹配abc-123456-defghiwxyz_678。此列表中的这些子字符串可以包含除空格之外的任何字符,并且列表中可以包含任意数量的子字符串;我只是用上面的3个具体来举例说明。由于我需要对其进行修改以便能够多次匹配,因此以下内容无效...

String regex = "rules\\s\\{\\s([^\\s]*)\\s\\}";
final Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(output);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

如何修改上述正则表达式以考虑多个可能的匹配并获得以下输出?

abc-123
456-defghi
wxyz_678

1 个答案:

答案 0 :(得分:3)

这是一步法:使用1个正则表达式“匹配所有”。

regex

(?:\brules\s+\{|(?!^)\G)\s+([\w-]+)

正则表达式匹配整个单词rules后跟一个或多个空格符号,如果找到1个或更多空格后跟1个或多个字母数字符号或连字符的序列,它也会在上次成功后匹配比赛。 rules这个词对我们来说是一种边界。

Java code

String output = "regulations { qux def } standards none rules { abc-123 456-defghi wxyz_678  } security { enabled }"; 
String regex = "(?:\\brules\\s+\\{|(?!^)\\G)\\s+([\\w-]+)";
final Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(output);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

这是一个两步法:1)获取rules {}之间的子串,2)用空格分割。

String output = "regulations { qux def } standards none rules { abc-123 456-defghi wxyz_678  } security { enabled }"; 
String subst = output.replaceFirst("(?s)^.*\\brules\\s*[{]\\s*([^{}]+)[}].*$", "$1");
String[] res = subst.split("\\s+");
System.out.println(Arrays.toString(res));

请参阅IDEONE demoregex demo

正则表达式更简单,它只匹配rules {之前的所有内容,然后捕获{...}内的内容,然后匹配}和其余字符串。使用反向引用$1,我们将此第1组值恢复为subst变量。然后分开。