Java Regex:在同一行上捕获多个匹配项

时间:2020-03-04 21:42:02

标签: java regex

我正在尝试创建一个正则表达式,以匹配同一行上的一个或多个变量值分配。我正在使用以下表达式:

([a-z][a-zA-Z0-9-]*)=(('(\'|[^\'])*')|("(\"|[^"])*"))

例如,如果我输入以下字符串:

a="xyz" b="hello world"

并使用以下代码:

Matcher matcher = rules.get(regex).matcher(input);
int start = 0;

while (matcher.find(start)) {
    System.err.println(matcher.group(0));

    start = matcher.end();
}

它应该给我两个不同的结果:

1. a="xyz"
2. b="hello world"

但是它只返回一个,即整个输入字符串。

a="xyz" b="hello world"

似乎以xyz" b="hello world为内在部分。我该如何解决?

1 个答案:

答案 0 :(得分:2)

您可以使用

(?s)([a-z][a-zA-Z0-9-]*)=(?:'([^\\']*(?:\\.[^\\']*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)")

请参见regex demo

在Java中,

String regex = "(?s)([a-z][a-zA-Z0-9-]*)=(?:'([^\\\\']*(?:\\\\.[^\\\\']*)*)'|\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\")";

详细信息

  • (?s)-与Pattern.DOTALL也匹配换行符的内联.嵌入式标志选项
  • ([a-z][a-zA-Z0-9-]*)-第1组
  • =-等号
  • (?:'([^\\']*(?:\\.[^\\']*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)")-与两个选项之一匹配的非捕获组:
    • '([^\\']*(?:\\.[^\\']*)*)'-',然后是\'以外的任意数量的字符,后跟0+重复的任何转义序列,后跟0+字符,而不是{ {1}}和\
    • '-或
    • |-"([^"\\]*(?:\\.[^"\\]*)*)",然后是"\以外的任意数量的字符,后跟0+重复的任何转义序列,后跟0+字符,而不是{ {1}}和"