为什么这种多行Java模式不匹配?

时间:2014-10-19 13:29:55

标签: java regex pattern-matching multiline

我以为我已经理解了这些分隔符在Java正则表达式上的匹配方式,以及多行修饰符如何影响它,但最终我无法得到这个简单的代码示例来给我预期的结果。

还在SO上阅读了几个类似的问题,解决方案始终使用(?m)修饰符。那么,这个例子有什么问题?

public class Test{

     public static void main(String []args){
        System.out.println("foo\nTAG\nbar".matches("(?m)^TAG$") ? "matches" : "dont match");
     }
}

打印不匹配。可以在http://www.compileonline.com/compile_java_online.php

进行测试

1 个答案:

答案 0 :(得分:2)

匹配方法尝试匹配整个输入字符串。所以改变你的正则表达式如下,以获得匹配。在多行模式(?m)中,点不会与换行符匹配。要匹配任何字符(包括换行符),您需要使用与空格或非空格字符匹配的[\S\s]

在Dotall模式(?s)中,您只需使用.*匹配任何字符(包括换行符)零次或多次。

修饰符甚至可以组合为(?ms),以充分利用两种模式中的最佳效果。

System.out.println("foo\nTAG\nbar".matches("(?m)[\\s\\S]*^TAG$[\\s\\S]*") ? "matches" : "dont match");
System.out.println("foo\nTAG\nbar".matches("(?s).*?(^|\n)TAG(\n|$).*") ? "matches" : "dont match");
System.out.println("foo\nTAG\nbar".matches("(?ms).*?^TAG$.*") ? "matches" : "dont match");

<强>输出:

matches
matches
matches