我以为我已经理解了这些分隔符在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
进行测试答案 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