正则表达式 - 禁止一系列字符

时间:2012-01-15 17:05:25

标签: java regex

我有一个{varName}或{varName,“defaultValue”}形式的变量,我想要一个匹配它的正则表达式。 varName只是字母数字和“_”(\ w +),默认值可以是除了表示变量结尾的“}组合之外的任何值。白色空格在大括号,逗号,varName或defaultValue之间无关紧要。到目前为止,我提出的正则表达式是

\{\s*(\w+)\s*(,\s*\"([^(\"\})]*)\"\s*)?\}

问题是匹配结束于第一个“OR”而不是组合,即{hello,“world”}确实匹配但{hello,“wor”ld“}或{hello,”wor} ld“ }

知道如何解决这个问题吗?如果这有帮助,我使用Java编写它。

2 个答案:

答案 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"}
*/