gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:08:03 26 4
gpt4 key购买 nike

我正在尝试使用 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 #1"
,"* * * * *" //cron string
,"false" eq exec("command #3")) //condition
),exec(
"command #2"
,"exec("command #4") //condition
);]

但是得到

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

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

最佳答案

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

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

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

也可以指定(?s),等价于:

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

关于java - 正则表达式中的贪婪匹配(java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com