Java 如何更好地匹配引号之间的字符串

Java 如何更好地匹配引号之间的字符串,java,json,regex,string,match,Java,Json,Regex,String,Match,我有一个JSON文件,需要在不使用任何外部库的情况下读取和加载,所以我最好使用正则表达式。我当前用于查找字符串的正则表达式是\“\\.*\”,但由于某种原因,整个JSON文件都是匹配的,所以我得到了“FIRST”:“Galina98”,“LAST”:“Murray856”,“SUFFIX”:“,而不是“FIRST”,为什么会发生这种情况?我认为圆点应该避开换行符 还是有更好的正则表达式?我的主要问题是,我想有两种模式,一种用于左边的单词,另一种用于右边的单词,例如\\\.\\\\\:和:\\\\

我有一个JSON文件,需要在不使用任何外部库的情况下读取和加载,所以我最好使用正则表达式。我当前用于查找字符串的正则表达式是
\“\\.*\”
,但由于某种原因,整个JSON文件都是匹配的,所以我得到了
“FIRST”:“Galina98”,“LAST”:“Murray856”,“SUFFIX”:“
,而不是
“FIRST”
,为什么会发生这种情况?我认为圆点应该避开换行符


还是有更好的正则表达式?我的主要问题是,我想有两种模式,一种用于左边的单词,另一种用于右边的单词,例如
\\\.\\\\\:
:\\\\\\.\\\\\\\\\\\\\\\\\\'
,我如何做到这一点?

使用不情愿的量词
*?
,而不是贪婪的
*
;以及为键和值捕获组,如:
“(.*?):”(.*?”
。使用
Matcher#find()
搜索每个事件,如:

var text = """
           "FIRST":"Galina98", \
           "LAST":"Murray856", \
           "SUFFIX":"" \
           """;
var pattern = Pattern.compile("\"(.*?)\":\"(.*?)\"");
var matcher = pattern.matcher(text);
while (matcher.find()) {
    var key = matcher.group(1);
    var value = matcher.group(2);
    ...
}
(.*)
*?

*?
将匹配任何字符的最小数目(以便匹配表达式的其余部分)-
*?
是一个不情愿的量词,因为它试图匹配尽可能短的序列;与贪婪的量词
*
相反,贪婪的量词试图尽可能多地匹配


一种更好/更快的方法(如Omar Si)是使用
[^”]*
,即匹配尽可能多的非
字符

所以Java模式应该是

var pattern = Pattern.compile("\"([^\"]*)\":\"([^\"]*)\"");


请注意,正则表达式(单独使用)并不是解析的最佳工具(例如,在键或值内有双引号;换行符;…)

尝试
\”([^\“]*)\:“([^\“]*)\”
谢谢omar,这很有效,但它首先给了我代码
:“Jorge”
,相反,我只希望
有一个正则表达式“第一个
和第二个正则表达式只用于
“Jorge”
我想你可以只做
\“[^\“]*\”
,如果你不在乎哪个是哪个的话。你的正则表达式匹配一个引号,一个文字点,然后是一个引号。即
。在做任何其他事情之前,完全删除双反斜杠。请注意使用
[^\]*
*?
更有效,因为
*?
将逐字符匹配,而
[^\“]*
将立即匹配所有不是引号的内容。@OmarSi正则表达式引擎的所有处理/匹配都是逐字符进行的。@波希米亚人可能是我说错了。
*?
将尽可能少地匹配,这意味着它将从引号后的第一个字符开始,并尝试逐字符匹配,直到找到另一个引号为止。e> [^\“]*将立即匹配所有不是报价的内容,从而减少所需的步骤数。您可以比较此处的步骤数与抱歉,我之前的测试不是最好的。我改为排除模式的编译、匹配器的创建和组的阅读;现在对Samuel V给出的文本只进行了4次
find();不情愿:1181724