Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 正则表达式中的问号:';Pattern.compile(“title:\”(.*))';和';Pattern.compile(“title:\*”)';_Java_Regex - Fatal编程技术网

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组存在(用括号谈论同一个正则表达式)?