使用正则表达式匹配分隔列表中的子字符串
Matching on Substrings in Delimited List Using Regex
我正在尝试在 Java 中制定一个正则表达式以捕获 space 分隔列表中的多个字符串。这是我试图从 ...
中捕获的字符串
String output = "regulations { qux def } standards none rules { abc-123 456-defghi wxyz_678 } security { enabled }";
我想使用正则表达式来匹配紧跟在 rules
之后的 space 分隔列表中的每个单词。换句话说,我希望正则表达式匹配 abc-123
、456-defghi
和 wxyz_678
。这个列表中的这些子串可以包含除whitespace以外的任意字符,列表中可以有任意数量的子串;我只是专门用了上面的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 个正则表达式 "match them all"。
(?:\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*([^{}]+)[}].*$", "");
String[] res = subst.split("\s+");
System.out.println(Arrays.toString(res));
参见 IDEONE demo and the regex demo。
正则表达式要简单得多,它只匹配 rules {
之前的所有内容,然后捕获 {...}
中的内容,然后匹配 }
和字符串的其余部分.通过反向引用 </code>,我们将第 1 组值恢复到 <code>subst
变量。那就分裂吧。
我正在尝试在 Java 中制定一个正则表达式以捕获 space 分隔列表中的多个字符串。这是我试图从 ...
中捕获的字符串String output = "regulations { qux def } standards none rules { abc-123 456-defghi wxyz_678 } security { enabled }";
我想使用正则表达式来匹配紧跟在 rules
之后的 space 分隔列表中的每个单词。换句话说,我希望正则表达式匹配 abc-123
、456-defghi
和 wxyz_678
。这个列表中的这些子串可以包含除whitespace以外的任意字符,列表中可以有任意数量的子串;我只是专门用了上面的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 个正则表达式 "match them all"。
(?:\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*([^{}]+)[}].*$", "");
String[] res = subst.split("\s+");
System.out.println(Arrays.toString(res));
参见 IDEONE demo and the regex demo。
正则表达式要简单得多,它只匹配 rules {
之前的所有内容,然后捕获 {...}
中的内容,然后匹配 }
和字符串的其余部分.通过反向引用 </code>,我们将第 1 组值恢复到 <code>subst
变量。那就分裂吧。