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

前端之家收集整理的这篇文章主要介绍了正则表达式中的贪婪匹配(java)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_2@
我正在尝试使用 java regex对下面的输入进行标记.我相信我的表达式应该贪婪地匹配下面程序中的外部“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 #1","* * * * *" //cron string,"false" eq exec("command #3")) //condition
),exec(
    "command #2","exec("command #4") //condition
);]

但得到

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

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

解决方法

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

您可以使用@L_502_1@来允许在换行符上进行匹配:

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

或者,可以指定(?s),它是等效的:

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

猜你在找的正则表达式相关文章