我正在尝试用 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
最佳答案
这是一个 1 步方法:使用 1 个正则表达式来“将它们全部匹配”。
(?:\brules\s+\{|(?!^)\G)\s+([\w-]+)
正则表达式匹配整个单词 rules
后跟 1 个或多个空格符号,如果它找到 1 个或多个空格后跟 1 个或多个字母数字符号或连字符的序列,它也会匹配紧随其后的最后一次成功的比赛。 规则
这个词对我们来说是一种边界。
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 demo 和 regex demo 。
正则表达式要简单得多,它只匹配 rules {
之前的所有内容(包括 rules {
),然后捕获 {...}
内的内容,然后匹配 }
和字符串的其余部分。通过反向引用 $1
,我们将第 1 组值恢复为 subst
变量。然后就分开了。
关于java - 使用正则表达式匹配分隔列表中的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34069272/