我正在尝试以两种基本形式从长字符串中提取键值对,一种带引号,一种不带引号,例如
... a="First Field" b=SecondField ...
使用Java
正则表达式
\b(a|b)\s*(?:=)\s*("[^"]*"|[^ ]*)\b
但是,运行以下测试代码
public static void main(String[] args) {
String input = "a=\"First Field\" b=SecondField";
String regex = "\\b(a|b)\\s*(?:=)\\s*(\"[^\"]*\"|[^ ]*)\\b";
Matcher matcher = Pattern.compile(regex).matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(1) + " = " + matcher.group(2));
}
}
输出是
a = "First
b = SecondField
而不是所需的(不带引号)
a = First Field
b = SecondField
在更广义的输入中,例如
a ="First Field" b=SecondField c3= "Third field value" delta = "" e_value = five!
输出应该是(同样,不带引号,并且前后有不同数量的空格)=
sign)
a = First Field
b = SecondField
c3 = Third field value
delta =
e_value = five!
是否有一个正则表达式来涵盖上述用例(至少是带有 2 个键的版本),或者应该诉诸字符串处理?
更棘手的问题:如果存在这样的正则表达式,是否还有任何方法可以保持与值对应的匹配器组的索引不变,以便带引号的字段值和不带引号的字段值都对应于相同的组索引?