为什么不是';这不是多行Java模式匹配吗?
我以为我已经了解了这些分隔符在Java正则表达式上的匹配方式,以及多行修饰符如何影响它,但最终我无法获得这个简单的代码示例来提供预期的结果 同时阅读一些关于SO的类似问题,解决方案总是使用为什么不是';这不是多行Java模式匹配吗?,java,regex,pattern-matching,multiline,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$") ? "mat
(?m)
修饰符。那么,这个例子有什么问题
public class Test{
public static void main(String []args){
System.out.println("foo\nTAG\nbar".matches("(?m)^TAG$") ? "matches" : "dont match");
}
}
指纹不匹配。可以在匹配处测试。方法尝试匹配整个输入字符串。所以,像下面这样更改您的正则表达式以获得匹配。在多行模式下,
(?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
不确定发生了什么,但是
匹配
尝试匹配整个字符串,而不是其中的一部分。哦,上帝。这就是问题所在。请贴出答案