小编典典

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

all

我正在尝试使用 java
匹配多行文本。当我使用Pattern带有Pattern.MULTILINE修饰符的类时,我可以匹配,但我不能这样做(?m).

(?m)with和 using的相同模式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?

阅读 87

收藏
2022-07-27

共1个答案

小编典典

首先,您在不正确的假设下使用了修饰符。

Pattern.MULTILINE(?m)告诉 Java 接受锚点^$在每行的开头和结尾匹配(否则它们只在整个字符串的开头/结尾匹配)。

Pattern.DOTALL或者(?s)告诉 Java 也允许点匹配换行符。

其次,在您的情况下,正则表达式失败,因为您正在使用matches()期望正则表达式匹配 整个 字符串的方法 -
这当然不起作用,因为在(\\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:

2022-07-27