@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@