回车和换行

今天在做爬虫的时候,需要匹配下面Title中的内容,发现写的正则表达式question_link(.)>(\n)(.+)(\n*)<竟然匹配不上里面的中文,原来在win系统中文件中的换行其实包含了两个字符, /CR(回车),/LF(换行),这两个”.”都是匹配不上的.

1
2
3
<h2><a class="question_link" href="/question/270597366/answer/355546388" data-id="22407872" data-za-element-name="Title">
如何看待星巴克被指含有致癌物质(丙烯酰胺Acrylamide)?
</a></h2>

修改成下面,成功匹配

1
question_link(.*)>(\r)(\n)(.*)

完整代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 其中这段是从文件中摘录的,文件中查看特殊符号显示了换行包含两个字符 一个回车一个换行
String s = "<h2><a class="question_link" href="/question/270597366/answer/355546388" data-id="22407872" data-za-element-name="Title">
如何看待星巴克被指含有致癌物质(丙烯酰胺Acrylamide)?
</a></h2>"

String regex = "question_link(.*)>(\\r)(\\n)(.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(sb.toString());
matcher.find();
String group = matcher.group(4);
System.out.println(group);

// 输出:
// 如何看待星巴克被指含有致癌物质(丙烯酰胺Acrylamide)?

小示例:

1
2
3
4
5
6
7
8
9
String s1 = "\r1234\r567";
String s2 = "\n12345";
System.out.println(s1);
System.out.println(s2);

// 输出:
567

12345

再次强调,回车和换行,”.”都不能匹配

1
2
3
4
5
6
7
String s1 = "\r1234\r567";
String regex = ".*";
String regex1 = "\\r.*";
Pattern pattern = Pattern.compile(regex1); // 换成regex则下面的输出为空,也就是不能匹配
Matcher matcher = pattern.matcher(s1);
matcher.find();
System.out.println(matcher.group());

更多知识请参考:

终于搞懂了回车与换行的区别