java正则表达式备忘

Posted zhjh256

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java正则表达式备忘相关的知识,希望对你有一定的参考价值。

最近框架和爬虫上常要处理字符串匹配和替换的场景,备忘。

非贪婪模式

比如要匹配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("(\\d3)\\d4(\\d4)", "$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正则表达式备忘的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式备忘录

JS 常用正则表达式备忘录

JS 常用正则表达式备忘录

text 正则表达式备忘单

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

js正则表达式验证匹配数字匹配字符串匹配中文匹配任意字符备忘录