我正在尝试创建一个正则表达式,以匹配同一行上的一个或多个变量值分配。我正在使用以下表达式:
([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
为内在部分。我该如何解决?
答案 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}}和"
。