我试图在Java中制定一个正则表达式,以在空格分隔的列表中捕获多个字符串。这是我想要捕获的字符串......
String output = "regulations { qux def } standards none rules { abc-123 456-defghi wxyz_678 } security { enabled }";
我希望使用正则表达式匹配紧跟在rules
之后的括号之间的空格分隔列表中的每个单词。换句话说,我希望正则表达式匹配abc-123
,456-defghi
和wxyz_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
答案 0 :(得分:3)
这是一步法:使用1个正则表达式“匹配所有”。
(?:\brules\s+\{|(?!^)\G)\s+([\w-]+)
正则表达式匹配整个单词rules
后跟一个或多个空格符号,如果找到1个或更多空格后跟1个或多个字母数字符号或连字符的序列,它也会在上次成功后匹配比赛。 rules
这个词对我们来说是一种边界。
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));
正则表达式更简单,它只匹配rules {
之前的所有内容,然后捕获{...}
内的内容,然后匹配}
和其余字符串。使用反向引用$1
,我们将此第1组值恢复为subst
变量。然后分开。