我有一个{varName}或{varName,“defaultValue”}形式的变量,我想要一个匹配它的正则表达式。 varName只是字母数字和“_”(\ w +),默认值可以是除了表示变量结尾的“}组合之外的任何值。白色空格在大括号,逗号,varName或defaultValue之间无关紧要。到目前为止,我提出的正则表达式是
\{\s*(\w+)\s*(,\s*\"([^(\"\})]*)\"\s*)?\}
问题是匹配结束于第一个“OR”而不是组合,即{hello,“world”}确实匹配但{hello,“wor”ld“}或{hello,”wor} ld“ }
知道如何解决这个问题吗?如果这有帮助,我使用Java编写它。
答案 0 :(得分:1)
final Pattern p = Pattern.compile("\\{\\s*(\\w+)\\s*(,\\s*\"((?!\"\\}).*)\"\\s*)?\\}");
Matcher m1 = p.matcher("{hello, \"world\"}");
if (m1.matches()) {
System.out.println("var1:" + m1.group(1));
System.out.println("val1:" + m1.group(3));
}
Matcher m2 = p.matcher("{hello, \"wor}ld\"}");
if (m2.matches()) {
System.out.println("var2:" + m2.group(1));
System.out.println("val2:" + m2.group(3));
}
Matcher m3 = p.matcher("{hello, \"wor}\"ld\"}");
if (m3.matches()) {
System.out.println("var3:" + m3.group(1));
System.out.println("val3:" + m3.group(3));
}
/*output:
var1:hello
val1:world
var2:hello
val2:wor}ld
var3:hello
val3:wor}"ld */
答案 1 :(得分:1)
我找到了自己问题的解决方案,分享是公平的。以下正则表达式:
\{\s*(\w+)\s*(,\s*\"((.*?)\s*\")?\})
会做到这一点,停在''}'的第一个序列
在Java中,这将是(继续上一个答案的例子):
final Pattern p = Pattern.compile("\\{\\s*(\\w+)\\s*(,\\s*\"(.*?)\\s*\"\\s*)?\\}");
Matcher m1 = p.matcher("{hello, \"world\"}");
if (m1.matches()) {
System.out.println("var1:" + m1.group(1));
System.out.println("val1:" + m1.group(3));
}
Matcher m2 = p.matcher("{hello, \"wor\"rld\"}\"}");
if (m2.matches()) {
System.out.println("var2:" + m2.group(1));
System.out.println("val2:" + m2.group(3));
}
/* Output
var1:hello
val1:world
var2:hello
val2:wor"rld"}
*/