java - 使用正则表达式匹配多行文本

标签 java regex

我正在尝试使用 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/

相关文章:

java - jboss兼容性矩阵?

java - 在 Java 中从私有(private)获取公钥

java - 如果没有用Gson初始化如何不写float(GsonBuilder())

c++ - 尝试在 C++ 中使用 boost 正则表达式匹配从字符串转换为 int 时出错

java - asm 3.1 和 org.eclipse.persistence.asm-2.3.2.jar (jersey-moxy 1.15) 的兼容性问题

javascript - 帮助 JavaScript 正则表达式

c - 正则表达式 - 获取字符串的每个部分(除了中间部分)

没有第一个字符的Android linkify

java - 如何终止 Java 中的正则表达式匹配?

java - 冒泡异常 : Java