Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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)_Java_Regex - Fatal编程技术网

正则表达式中的贪婪匹配(java)

正则表达式中的贪婪匹配(java),java,regex,Java,Regex,我正在尝试使用java正则表达式标记下面的输入。我相信我的表达式应该与下面程序中的外部“exec”标记完全匹配 @Test public void test(){ String s = "exec(\n" + " \"command #1\"\n" + " ,\"* * * * *\" //cron string\n" + " ,\"false\" eq ex

我正在尝试使用java正则表达式标记下面的输入。我相信我的表达式应该与下面程序中的外部“exec”标记完全匹配

@Test
    public void test(){
        String s = "exec(\n" +
                "    \"command #1\"\n" +
                "    ,\"* * * * *\" //cron string\n" +
                "    ,\"false\" eq exec(\"command #3\")) //condition\n" +
                ")\n" +
                "\n" +  //split here
                "exec(\n" +
                "    \"command #2\" \n" +
                "    ,\"exec(\"command #4\") //condition\n" +
                ");";
        List<String> matches = new ArrayList<String>();
        Pattern pattern = Pattern.compile("exec\\s*\\(.*\\)");
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()) {
            matches.add(matcher.group());
        }
        System.out.println(matches);
    }
但是得到

[exec("command #3")), exec("command #4")]

有人能帮我理解我哪里出错了吗?

默认情况下,点字符
与换行符不匹配。这里,在这种情况下,“exec”模式只有在同一行上出现时才会匹配

您可以使用允许对换行符进行匹配:

Pattern.compile("exec\\s*\\(.*\\)", Pattern.DOTALL);

或者可以指定
(?s)
,这相当于:

Pattern.compile("(?s)exec\\s*\\(.*\\)");

默认情况下,Java正则表达式模式在换行符上不匹配
您的意思可能是
默认情况下不匹配新行。
Pattern.compile("(?s)exec\\s*\\(.*\\)");