Java的正则表达式
正则的思路是什么?
正则的思路是关注自己要什么内容,以取组的方式,将数据拿出来。
其他都是不重要的,写一下标志性的文字,以快速定位到我们要的数据附近,非标志性文字,尽皆用.+?组合拳直接匹配过去。自己需要的数据,就用括号括起来,然后以取组的形式,将数据取出来。
有常用的就几个\s,\S,\t,(),.,+,?
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
() 括号,括住想要取出的内容。官方说法:标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。
. 匹配除换行符 \n 之外的任何单字符。
+ 匹配前面的子表达式一次或多次。
? 非贪婪匹配,+、*默认都是贪婪匹配,会一直匹配下去,直到碰到你写的文字
组合拳
[\s,\S]+?和.+?匹配一切字符,专门解决那些无用文字。
正则的创作
例子:
我们任务是截获这里面的一个a链接重定向地址
你的文章
匹配的通配符:
class=“con_con”[\s,\S]+?<a href=“(.+?)”[\s,\S]+?零售价格表
其中class就是非常明显的标志,不过这里截取的片段太少,就体现不出来作用,后面的[\s,\S]+?组合拳匹配一切无用文字,<a的标签头来精确定位,最后依靠(.+?)来获取href里面的字段。后面再来个零售价格表,保证不会匹配到其他的a标签
Java对字符串的正则
//JS数据爬取
//获取当前页面的核心列表
String s = page.getHtml().regex(JSConstants.kernelPattern).toString();
//获取时间、标题和链接
String pattern = JSConstants.supplementPattern;
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(s);
//找出匹配项中的全部链接
extracted(m);
//提出数据中的所有链接
private void extracted(Matcher m) {
while (m.find()) {
IndexPage indexPage = new IndexPage();
Date date = new Date();
String link = m.group(1);
String title = m.group(2);
String time = m.group(3);
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse(time);
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
indexPage.setTime(date);
indexPage.setTitle(title);
indexPage.setLink("不告诉你我的爬取网址" + link);
indexPageList.add(indexPage);
}
}
核心代码其实不多。
-
获取字符串
str
。 -
声明一个
Pattern
对象,调用其compile
静态方法,获取一个正常的统配符对象r。 -
通过
r
的matcher()
方法,给它我们的字符串str
,即r.matcher(str),获得一个matcher
对象m
-
最后,就可以通过matcher对象取出我们想要的数据,取出组的话,要使用
m
的方法group()
,0是取出所有匹配字符串,即不会按照组这个说法来匹配,之后就可以依次取出我们用括号括起来的内容。