我试图用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个或多个字母数字符号或连字符的序列,则它也将在最后一次成功匹配后立即匹配。这个词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
变量。然后分开。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句