Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java regex-不允许字符序列_Java_Regex - Fatal编程技术网

Java regex-不允许字符序列

Java regex-不允许字符序列,java,regex,Java,Regex,我有一个{varName}或{varName,“defaultValue”}形式的变量,我想要一个匹配它的正则表达式。varName仅为字母数字和“”(\w+),默认值可以是除“}”组合以外的任何值,后者表示变量的结尾。大括号、逗号、varName或defaultValue之间的空格无关紧要。到目前为止,我提出的正则表达式是 \{\s*(\w+)\s*(,\s*\"([^(\"\})]*)\"\s*)?\} 问题是匹配在第一个“OR}处结束,而不是组合,即{hello,“world}确实匹配,

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

\{\s*(\w+)\s*(,\s*\"([^(\"\})]*)\"\s*)?\}
问题是匹配在第一个“OR}处结束,而不是组合,即{hello,“world}确实匹配,但{hello,“wor”ld}或{hello,“wor}ld}


你知道如何解决这个问题吗?如果这有帮助,我将使用Java进行编码。

我已经找到了解决我自己问题的方法,这是公平的。下面的正则表达式:

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 */
\{\s*(\w+)\s*(,\s*\"((.*?)\s*\")?\})
将执行此操作,在“}”的第一个序列处停止

在Java中,这将是(继续前面答案的示例):


也许我的问题不清楚,但内容本身不止一个变量。在{hello,“world”}的情况下,我只需要“hello”和“world”,但我得到“hello”和“world”}。变量值应该在第一个“}”处停止。对于单个正则表达式来说,这可能太多了。请尝试使用StringUtils.substringBefore(m1.group(3),“\”}”)我们讨论的是一个巨大的字符串,其中性能至关重要,我不知道有多少“}我将在内容中有:)2个问题:
1
您的默认值是否总是用双引号括起来
2。
您为什么要将
“wor”ld“
作为默认值,它应该是
“wor\”ld”
。1.是的,默认值总是用双引号括起来。2.在内容本身(文本文件)中,它将显示为“worl”d。我已经找到了解决方案,并将其作为答案之一发布。谢谢;)
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"}
*/