Java正则表达式:在同一行上捕获多个匹配项

问题描述 投票:3回答:1

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

([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作为内部部分。我该如何解决?

java regex
1个回答
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+次重复,后跟[+ C0]和\以外的0+个字符
    • '-或
    • [|-"([^"\\]*(?:\\.[^"\\]*)*)",然后是"\以外的任意数量的字符,后跟任意转义序列的0+次重复,后跟[+ C0]和"以外的0+个字符。
© www.soinside.com 2019 - 2024. All rights reserved.