为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

汪汪一只猫 2019-07-06 16:17:12
使用正则表达式匹配多行文本我正在尝试使用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());  //trueString pattern2 = "(?m)User Comments: (\\W)*(\\S)*";System.out.println(test.matches(pattern2));  //false - why?
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

str.matches(regex) 表现得像 Pattern.matches(regex,  str),它尝试将整个输入序列与模式匹配并返回。

true当且仅当输入序列与匹配器的模式匹配

鉴于matcher.find() 试图寻找与模式匹配并返回的输入序列的下一个子序列。

true当且仅当子序列的输入序列与匹配器的模式相匹配。

因此,问题在于正则表达式。试试下面的方法。

String test = "User Comments: This is \t a\ta \ntest\n\n message \n";String pattern1 = "User Comments:
 [\\s\\S]*^test$[\\s\\S]*";Pattern p = Pattern.compile(pattern1, Pattern.MULTILINE);System.out.println(p.matcher(test).find()); 
  //trueString pattern2 = "(?m)User Comments: [\\s\\S]*^test$[\\s\\S]*";System.out.println(test.matches(pattern2));  //true

因此,简而言之,(\\W)*(\\S)*第一个正则表达式中的部分将空字符串匹配为*表示零次或更多次,而真正匹配的字符串是User Comments:而不是你所期望的整根绳子。第二个失败,因为它试图匹配整个字符串,但它不能\\W匹配非字符[^a-zA-Z0-9_]第一个角色是T一个字。


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 2293 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信