我正在尝试使用 java 匹配多行文本。当我将 Pattern
类与 Pattern.MULTILINE
修饰符一起使用时,我能够匹配,但我无法使用 (?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?
最佳答案
首先,您在错误假设下使用了修饰符。
Pattern.MULTILINE
或 (?m)
告诉 Java 接受 anchor ^
和 $
匹配在每行的开头和结尾(否则它们只匹配整个字符串的开头/结尾)。
Pattern.DOTALL
或 (?s)
告诉 Java 也允许点匹配换行符。
其次,在您的情况下,正则表达式失败,因为您使用的是 matches()
方法,该方法期望正则表达式匹配 entire 字符串 - 这当然不会'不起作用,因为在 (\\W)*(\\S)*
匹配后还剩下一些字符。
因此,如果您只是在寻找以 User Comments:
开头的字符串,请使用正则表达式
^\s*User Comments:\s*(.*)
使用 Pattern.DOTALL
选项:
Pattern regex = Pattern.compile("^\\s*User Comments:\\s+(.*)", Pattern.DOTALL);
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
ResultString = regexMatcher.group(1);
}
ResultString
将包含 User Comments:
关于java - 使用正则表达式匹配多行文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3651725/