使用正则表达式匹配多行文本
尝试使用 Java 匹配多行文本时,您可能会遇到使用 Pattern.MULTILINE 修饰符和(?m) 表达式。下面是一个解释差异并提供解决方案的示例:
我们有以下多行文本:
User Comments: This is \t a\ta \n test \n\n message \n
带有 Pattern.MULTILINE 修饰符的图案:
String pattern1 = "User Comments: (\W)*(\S)*"; Pattern p = Pattern.compile(pattern1, Pattern.MULTILINE); System.out.println(p.matcher(test).find()); // true
此模式成功匹配文本,因为 Pattern.MULTILINE 修饰符允许 ^ 和 $在每行的开头和结尾处匹配的锚点。
带有 (?m) 表达式的模式:
String pattern2 = "(?m)User Comments: (\W)*(\S)*"; System.out.println(test.matches(pattern2)); // false
此模式无法匹配,因为 (?m) m) 表达式不正确。应该是 (?s) 来启用 DOTALL 模式,该模式允许点 (.) 匹配换行符。
此外,matches() 方法用于检查整个字符串是否与模式匹配。在这种情况下,模式只匹配字符串的一部分,因此 matches() 返回 false。
解决方案:
使用正则表达式正确匹配多行文本,您可以将以下模式与 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 中。
以上是如何使用Java正则表达式正确匹配多行文本?的详细内容。更多信息请关注PHP中文网其他相关文章!