zoukankan      html  css  js  c++  java
  • java正则表达式备忘

      最近框架和爬虫上常要处理字符串匹配和替换的场景,备忘。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
  • 相关阅读:
    python编程学习进度二
    python编程学习进度一
    阅读笔记(6)-《高效程序员的45个习惯》
    阅读笔记(5)-《高效程序员的45个习惯》
    阅读笔记(4)-《高效程序员的45个习惯》
    阅读笔记(3)-《高效程序员的45个习惯》
    阅读笔记(2)-《高效程序员的45个习惯》
    寒假生活15
    寒假生活14(补)
    寒假生活13
  • 原文地址:https://www.cnblogs.com/zhjh256/p/11025456.html
Copyright © 2011-2022 走看看