最近框架和爬虫上常要处理字符串匹配和替换的场景,备忘。java的正则表达式仿效了perl 5。

非贪婪模式

  比如要匹配html文本中的连接,例如a href="www.abc.com/xyz/o"需要替换为a href="www.bing.com?q=o",可以如下:

    static final String OSCHINA_LINK = "\"(https://www\\.abc\\.net/p/)(.+)\"";
static Pattern pattern = Pattern.compile(OSCHINA_LINK);
static String BING_SEARCH = "\"https://cn.bing.com/search?q=$2";

  但是此时会导致第一个href="之后的文字到最后一个"之间的内容都是链接地址了,因为java正则默认是贪婪模式。要想在第一个"就结束,需要非贪婪模式,也就是加上?,如下:

    static final String OSCHINA_LINK = "\"(https://www\\.abc\\.net/p/)(.+?)\"";
static Pattern pattern = Pattern.compile(OSCHINA_LINK);
static String BING_SEARCH = "\"https://cn.bing.com/search?q=$2";
        Matcher m = pattern.matcher(param.getData().getNewsBody());
StringBuffer sb = new StringBuffer();
// 使用find()方法查找第一个匹配的对象
boolean result = m.find();
// 使用循环将句子里所有的表找出并替换为用户名.表名,再将内容加到sb里
while (result) {
m.appendReplacement(sb, BING_SEARCH);
// 继续查找下一个匹配对象
result = m.find();
}
// 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
m.appendTail(sb);

分组替换

  还有一个场景是要在所有给定的关键字之前加上前缀,例如"abc,bcf,wdf"替换为"x.abc,x.bcf,x.wdf",其中关键字列表由输入给定。

  这个时候就需要分组替换了,用()进行分组。如下:

String tel = "18304072984";
// 括号表示组,被替换的部分$n表示第n组的内容
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.print(tel); // output: 183****2984 String one = "hello girl hi hot".replaceFirst("(\\w+)\\s+(\\w+)", "a.$2 a.$1");
String two = "hello girl hi hot".replaceAll("(\\w+)\\s+(\\w+)", "a.$2 a.$1");
System.out.println(one); // a.girl a.hello hi hot
System.out.println(two); // a.girl a.hello a.hot a.hi

java正则表达式备忘的更多相关文章

  1. 正则表达式备忘(基于JavaScript)

    基于JS学习的正则表达式 备忘 e.g.匹配以0开头的三位或四位区号,以-分格的7或8位电话号码var reg1 = /^0\d{2,3}\-\d{7,8}$/;或var reg1 = new Reg ...

  2. python之正则表达式备忘

    一简介:就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C ...

  3. java 命令--备忘

    java -Djava.ext.dirs=/tmp/spark-sample/lib/ -cp ./spark-sample-1.0.jar com.sample.StartLauncher

  4. Java NIO 备忘

    $.backlog:可以把它简单理解为一个 listening socket 的请求连接队列的限制.当队列中的连接请求达到队列限制时,kernel 会拒绝信的连接请求.只有当应用程序通过 accept ...

  5. java指令备忘

    javap  查看class文件用 指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 ...

  6. Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯

    Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...

  7. 0. Java虚拟机系列备忘预览图

    打算把Java虚拟机这块单独弄一个主题出来,做做备忘,结构如图所示: 后面还有一部分待更新...

  8. (备忘)Java web项目迁移到Centos7中验证码无法显示

    每天多学一点知识. 今天部署项目的时候出现验证码无法显示的问题,如下图所示:

  9. java开发微信公众平台备忘

    简单记录下前段时间开发的电子书的 公众平台的一些备忘及开发心得经验等 eclipse的一些技巧: 1.ctrl+shift+o 自动添加必要import空间及移除无用import 项目备忘+说明 1. ...

随机推荐

  1. 大数据之kafka-02.搞定kafka专业术语

    02.搞定kafka专业术语 在kafka的世界中有很多概念和术语是需要我们提前理解并且熟练掌握的,下面来盘点一下. 之前我们提到过,kafka属于分布式的消息引擎系统,主要功能是提供一套完善的消息发 ...

  2. Flask入门到放弃(五)—— 蓝图

    转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10980094.html 蓝图 Blueprint 模块化 随着flask程序越来越复杂,我们需要对 ...

  3. 介于JAVAswing和Socket写的聊天室

    在厦门的第一阶段给我们复习了JAVASE基础,第一阶段的小玩具叫我们自选题材,我自己选了聊天室这个内容,这个小玩具无论是线程,还是网络编程,都会涉及到,比较有综合性,所以我选了这个: 这是我的包体结构 ...

  4. Collaborative Knowledge base Embedding (CKE)

    Collaborative Knowledge base Embedding (CKE) 在推荐系统中存在着很多与知识图谱相关的信息,以电影推荐为例: 结构化知识(structural knowled ...

  5. 项目alpha冲刺-测试

    作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Alpha冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及可视化分析平台 这个作业的 ...

  6. css实现硬件加速

    原文请点击一下链接: http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-c ...

  7. Linux配置静态IP以及解决配置静态IP后无法上网的问题

    式一.图形界面配置

  8. python 格式化输出%s %f %d

    格式说明由%和格式字符组成,如%f,它的作用是将数据按照指定的格式输出.格式说明是由“%”字符开始的. 1.整型输出%d print 'my age is %d'% (26) 说明:%d相当于是一个占 ...

  9. Redis 高可用架构设计(转载)

    转载自:https://mp.weixin.qq.com/s?__biz=MzA3NDcyMTQyNQ==&mid=2649263292&idx=1&sn=b170390684 ...

  10. WinDbg常用命令系列---||(系统状态)

    ||(系统状态) 简介 双竖线 ( || ) 命令将打印指定的系统或当前正在调试的所有系统的状态. 使用形式 || System 参数 System 指定要显示的系统. 如果省略此参数,将显示正在调试 ...