Java正则

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);
        }
    }

核心代码其实不多。

  1. 获取字符串str

  2. 声明一个Pattern对象,调用其compile静态方法,获取一个正常的统配符对象r。

  3. 通过rmatcher()方法,给它我们的字符串str,即r.matcher(str),获得一个matcher对象m

  4. 最后,就可以通过matcher对象取出我们想要的数据,取出组的话,要使用m的方法group(),0是取出所有匹配字符串,即不会按照组这个说法来匹配,之后就可以依次取出我们用括号括起来的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值