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

标签 java regex string

我正在尝试用 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 步方法:使用 1 个正则表达式来“将它们全部匹配”。

regex:

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

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

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 { 之前的所有内容(包括 rules {),然后捕获 {...} 内的内容,然后匹配 } 和字符串的其余部分。通过反向引用 $1,我们将第 1 组值恢复为 subst 变量。然后就分开了。

关于java - 使用正则表达式匹配分隔列表中的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34069272/

相关文章:

java - 如何获取onKeyPressed持续时间?

java - java中如何将矩阵逆时针旋转90度?

java - 下载文件后,HtmlUnit 无法检索页面

regex - 您可以使用 sed 或 perl -pe 从二进制文件中删除一部分吗?

java - 格式化字符串以匹配模式

Java Web Start 未安装在 Windows 7 中

JavaScript 相当于 C# 的 Char.IsSymbol

python - 正则表达式 : Match up to a word or a maximum number of words

string - 判断整数是否为一位并在其前加零

php - 我需要在 PHP 中转义反斜杠吗?