• 提高你的Java代码质量吧:推荐在复杂字符串操作中使用正则表达式


    一、分析 

    字符串的操作,诸如追加、合并、替换、倒序、分隔等,都是在编码过程中经常用到的,而且Java也提供了append、replace、reverse、split等方法来完成这些操作,它们使用起来确实方便,但是更多的时候,需要使用正则表达式来完成复杂的处理。 

    二、场景 

    统计一篇文章中的单词的数量,代码如下 

     

    public static void main(String[] args){ 
        //接受键盘输入 
        Scanner input = new Scanner(System.in); 
        while(input.hasNext()){ 
            String str = input.nextLine(); 
            //使用split方法分隔后统计 
            int wordsCount =  str.split(" ").length; 
            System.out.println(str + "单词数:" + wordsCount); 
        } 
    } 

    使用split方法根据空格来分隔单词,然后计算分隔后的数组长度,这种方法可靠吗?我们看输出 

    Today is Monday 

    Today is Monday 单参数:3 

    Today is  Monday 

    Today is  Monday 单词数:4 

    Today is Monday?No! 

    Today is Monday?No! 单词数:3 

    I'm Ok. 

    I'm Ok. 单词数:2 

    注意到,除了第一个正确外,其它的都是错误的。第二条输入单词"Monday"前有两个空格,第三条输入中"NO"单词的前后没有空格,最后一个输入则没有把连写符号“'”考虑进去,这样统计出来的单词数量肯定错误一堆,那怎样才合理呢? 

    可以考虑使用正则表达式,代码如下 

     

    public static void main(String[] args){ 
        //接受键盘的输入 
        Scanner input = new Scanner(System.in); 
        while(input.hasNext()){ 
            String str = input.nextLine(); 
            //正则表达式对象 
            Pattern pattern = Pattern.compile("\b\w+\b"); 
            //生成匹配器 
            Matcher matcher = pattern.matcher(str); 
            //记录单场数量 
            int wordsCount = 0; 
            //遍历查找匹配,统计单场数量 
            while(matcher.find()){ 
                wordsCount++; 
            } 
            System.out.println(str + "单词数:" + wordsCount); 
        } 
    } 

    准不准确,我们看输入产生的结果:Today is Monday 

    Today is Monday 单参数:3 

    Today is  Monday 

    Today is  Monday 单词数:3 

    Today is Monday?No! 

    Today is Monday?No! 单词数:4 

    I'm Ok. 

    I'm Ok. 单词数:3 

    每项输出都是正确的,而且程序也不复杂,先生成一个正则表达式对象,然后使用匹配器进行匹配,之后通过一个while循环统计匹配的数量。 

    三、建议 

    正则表达式在字符串的查找、替换、剪切、复制、删除等方面都有着非凡的作用,特别是面对大量的文本字符串需要处理(如果需要锤炼大量的LOG日志)时,使用正则表达式可以大幅提高开发效率和系统性能。 

    但是正则表达式是一个恶魔,它会使程序难以读懂 

  • 相关阅读:
    作为一个蒟蒻谈一点考试经验(总结)
    Codeforces Round #517 Div. 2/Div. 1
    Codeforces访问提速攻略(小技巧)
    基数排序模板(基数排序,C++模板)
    k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)
    洛谷P4907【CYH-01】小奔的国庆练习赛 :$A$换$B$ $problem$(DFS,剪枝)
    BSGS及扩展BSGS总结(BSGS,map)
    FWT模板(洛谷P4717 【模板】快速沃尔什变换)(FWT)
    洛谷CF264D Colorful Stones(子序列匹配,思维)
    洛谷SP22343 NORMA2
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3238898.html
Copyright © 2020-2023  润新知