我正在尝试使用Java匹配多行文本。当我使用Pattern.MULTILINE
修饰符的Pattern
类进行匹配时,我能够匹配成功,但是使用(?m)
就无法进行匹配。
使用(?m)
和String.matches
的相同模式似乎不起作用。我确定我错过了什么,但是不知道是什么。
这是我尝试过的:
String test = "User Comments: This is \t a\ta \n test \n\n message \n";
String pattern1 = "User Comments: (\\W)*(\\S)*";
Pattern p = Pattern.compile(pattern1, Pattern.MULTILINE);
System.out.println(p.matcher(test).find()); //true
String pattern2 = "(?m)User Comments: (\\W)*(\\S)*";
System.out.println(test.matches(pattern2)); //false - why?
(?s)User Comments:\s*(.*)
гҖӮд»Һ@Amarghoshзҡ„еӣһзӯ”дёӯпјҢжҲ‘еҫ—еҲ°дәҶжЁЎејҸUser Comments: [\\s\\S]*
гҖӮиҝҷдёӨз§Қж–№жі•жҳҜеҗҰжңүжӣҙеҘҪжҲ–жҺЁиҚҗзҡ„ж–№ејҸпјҢиҝҳжҳҜеҸӘжҳҜдёӨз§ҚдёҚеҗҢзҡ„еҒҡжі•пјҹ - Nivas[\s\S]
更加明确("匹配任何空格或非空格字符"),.
更易读,但您需要查找(?s)
或DOTALL
修改符以确定是否包括换行符。我更喜欢使用带有Pattern.DOTALL
标志的.
(在我看来,这比(?s)
更易于阅读和记忆)。您应该使用您感到最舒适的方式。 - Tim PietzckerDOTALL
的.*
更易读。我使用另一个来表明问题在于str.matches和matcher.find之间的差异,而不是标志。+1 - AmarghoshDOTALL
救了我。谢谢。 - WesternGun