Matcher类的简单使用

今天工作时遇到一个问题, 用正则处理html标签时不知该如何下手。还好有Matcher帮助解决了问题。

需求如下:

例如有如下html文章内容:

<p><a href="www.baidu.com">百度的链接</a>; 这是一个百度的链接。 <a href="www.jiakaobaodian.com">驾考宝典的链接</a>这是一个驾考宝典的链接</p>;

在我们做文章内链的时候, 往往掺杂了一些我们不想要的链接, 如上所示我们只想保留www.jiakaobaodian.com 的链接, 如下是我们希望得到的:

<p>这是一个百度的链接。<a href="www.jiakaobaodian.com">驾考宝典的链接</a>这是一个驾考宝典的链接</p>;

说白了就是去掉自己不需要的标签, 但是保留标签中的文本。

开始尝试用Jsoup,Dom4j 一类的解析这段html, 但是后面在删除标签的时候都遇到了问题, 最后尝试使用Matcher中的appendReplacement和appendReplacement才解决问题。

1, 使用实例:

输出结果是将没有匹配到的a标签都remove掉且保留了标签中的文字。

结果如下图:

下面在讲一个简单的案例:

public static void main(String[] args) throws Exception{

    Pattern p = Pattern.compile("(\\w+)%(\\d+)");

    Matcher m = p.matcher("前ab%12中cd%34后");

    StringBuffer s = new StringBuffer();

    while (m.find()) {

        m.appendReplacement(s, "app");

    }

    System.out.println(s);// 前app中app

    m.appendTail(s);

    System.out.println(s);// 前app中app后

}

先看下这段正则的匹配情况:

图中彩色的部分就是匹配到情况, 遇到这种需要正则匹配且时时看到结果的, 大家可以到: https://regex101.com/ 上测试。

然后看下输出结果:

2, 解释说明:

public Matcher appendReplacement(StringBuffer sb, String replacement)

将当前匹配子串替换为指定字符串,并将从上次匹配结束后到本次匹配结束后之间的字符串添加到一个StringBuffer对象中,最后返回其字符串表示形式。

注意:对于最后一次匹配,其后的字符串并没有添加入StringBuffer对象中,若需要这部分的内容需要使用appendTail方法。

public StringBuffer appendTail(StringBuffer sb)

将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。

更多内容大家可以查看Matcher类。

参考:http://www.cnblogs.com/SQP51312/p/6134324.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nimomeng的自我进阶

Collection官方文档

a) Keys必须实现NSCopying协议。添加成员的方法并不将每一个key直接进行添加,而是将每一个key进行copy并将copy后对象添加...

1404
来自专栏崔庆才的专栏

Scrapy爬虫去重效率优化之Bloom Filter的算法的对接

首先回顾一下Scrapy-Redis的去重机制。Scrapy-Redis将Request的指纹存储到了Redis集合中,每个指纹的长度为40,例如27adcc2...

1.1K6
来自专栏猿天地

Netty粘包拆包解决方案

前言 本篇文章是Netty专题的第六篇,前面五篇文章如下: 高性能NIO框架Netty入门篇 高性能NIO框架Netty-对象传输 高性能NIO框架Netty...

4657
来自专栏技术与生活

设计模式-备忘录模式

备忘录角色对如何其他对象提供一个接口,也就是宽接口的话,那么备忘录角色存储的内部状态都暴露给其他对象。这种情况导致发起人的状态都没看到,是破坏封装性的,只能通过...

982
来自专栏后端之路

批量查询DB的实现

背景 由于业务量的上涨,门店转入业务数据的需求,催生了一批excel导入系统的需求。但是由于原先excel导入的实现基于行的模式(一行一行导入) 导致系统导入的...

2167
来自专栏我杨某人的青春满是悔恨

封装一个 Swift-Style 的网络模块

Swift 跟 OC 有着完全不同的设计哲学,它鼓励你使用 protocol 而不是 super class,使用 enum 和 struct 而不是 clas...

893
来自专栏Java技术分享圈

杨老师课堂之Excel VBA 程序开发第八讲使用工作表函数

方式1:本节课件下载地址: https://pan.baidu.com/s/1D-MvbRcJRoyiA456xsTvMQ 密码:rzlr

1132
来自专栏非典型技术宅

Swift实践:使用CoreData存储多种数据类的通讯录1. CoreData支持存储数据类型2. 使用CoreData存储多种数据类的通讯录3. Codable

1783
来自专栏搜云库

Java并发基础:了解无锁CAS就从源码分析

CAS的全称为Compare And Swap,直译就是比较交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,...

1474
来自专栏岑玉海

Spark源码系列(九)Spark SQL初体验之解析过程详解

好久没更新博客了,之前学了一些R语言和机器学习的内容,做了一些笔记,之后也会放到博客上面来给大家共享。一个月前就打算更新Spark Sql的内容了,因为一些别的...

4045

扫码关注云+社区