Java 如何更好地匹配引号之间的字符串
我有一个JSON文件,需要在不使用任何外部库的情况下读取和加载,所以我最好使用正则表达式。我当前用于查找字符串的正则表达式是Java 如何更好地匹配引号之间的字符串,java,json,regex,string,match,Java,Json,Regex,String,Match,我有一个JSON文件,需要在不使用任何外部库的情况下读取和加载,所以我最好使用正则表达式。我当前用于查找字符串的正则表达式是\“\\.*\”,但由于某种原因,整个JSON文件都是匹配的,所以我得到了“FIRST”:“Galina98”,“LAST”:“Murray856”,“SUFFIX”:“,而不是“FIRST”,为什么会发生这种情况?我认为圆点应该避开换行符 还是有更好的正则表达式?我的主要问题是,我想有两种模式,一种用于左边的单词,另一种用于右边的单词,例如\\\.\\\\\:和:\\\\
\“\\.*\”
,但由于某种原因,整个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正则表达式引擎的所有处理/匹配都是逐字符进行的。@波希米亚人可能是我说错了。*?
将尽可能少地匹配,这意味着它将从引号后的第一个字符开始,并尝试逐字符匹配,直到找到另一个引号为止。find();不情愿:1181724