Java 正则表达式中的问号:';Pattern.compile(“title:\”(.*))';和';Pattern.compile(“title:\*”)';
我想知道这两个正则表达式是否有区别:Java 正则表达式中的问号:';Pattern.compile(“title:\”(.*))';和';Pattern.compile(“title:\*”)';,java,regex,Java,Regex,我想知道这两个正则表达式是否有区别: Pattern.compile("\"title\":\"(.*?)\""); Pattern.compile("\"title\":\".*\""); 部分(.*)和*看起来具有相同的含义 在这里,我得到了完全相同的结果: String title = null; Pattern p = Pattern.
Pattern.compile("\"title\":\"(.*?)\"");
Pattern.compile("\"title\":\".*\"");
部分(.*)
和*
看起来具有相同的含义
在这里,我得到了完全相同的结果:
String title = null;
Pattern p = Pattern.compile("\"title\":\"(.*?)\"");
//Pattern p = Pattern.compile("\"title\":\".*\"");
Matcher m = p.matcher("sdfssdfsdfsdfsdf\"title\":\"Here is the title\"sdfgdfgdfgdfgdfg");
if (m.find()) {
title = m.group();
}
System.out.println(title);
输出:
"title":"Here is the title"
hi
group1:
如果我不使用括号,我仍然可以找到这样的单独组:
Pattern p = Pattern.compile("\"title\":\".*?\"");
Matcher m = p.matcher("sdfssdfsdfsdfsdf\"title\":\"Here is the title\"dfdfgrt\"title\":\"Here is the title\"");
while (m.find()) {
System.out.println(m.group());
}
输出:
"title":"Here is the title"
"title":"Here is the title"
那么-我真的需要括号吗?这里有两件事:
()
-->指定捕获组。因此,如果您想捕获某些内容并希望稍后引用它,可以使用(您想在此处捕获的内容)
。没有大括号,就无法捕获数据
*
-->是贪婪的,即它试图获取整个字符串,减少一个字符,然后再次尝试匹配
*?
-->是惰性的(也称为不情愿),即从长度0开始,尝试匹配字符串,并在第一次匹配时停止
你可以看看
尝试此代码进行匹配
,而不进行捕获
Pattern p = Pattern.compile("abc(.*?)");
Matcher m = p.matcher("abc");
while (m.find()) {
System.out.println("hi");
System.out.println("group1: " + m.group(1));
}
输出:
"title":"Here is the title"
hi
group1:
非贪婪,捕获组。使用此
“sdfssdfsdfsdf\“title\”:\“这里是title\”“\“title\”:\“这里是title\”
输入进行检查。是的,没错-结果现在重复了两次。不知何故,我发现(上面的EDIT2)在我的情况下不需要括号。。我说得对吗?@ernestasgrouodis-Well,m.group()
返回整个匹配字符串。不是被俘的那群人。使用括号并尝试m.group(1)
,看看会发生什么:P(提示:不要在生产代码中尝试此操作:P)问题100%回答。但是为什么不在生产代码中(我的意思是有一种情况)?@Ernestasgroudis-小心确保有一个组,否则group(1)
会给您错误:)。请注意,group()
与group(0)
相同。实际组从1
开始。注意:group()
可以自由使用。但是如果m.find()
是true
,这不意味着第1组存在(用括号谈论同一个正则表达式)?