zoukankan      html  css  js  c++  java
  • [改善Java代码]推荐在复杂字符串操作中使用正则表达式

    一、分析 

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

    二、场景 

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

     1 import java.util.Scanner;
     2 
     3 public class Client {
     4     public static void main(String[] args) {
     5         //接收键盘输入
     6         Scanner input = new Scanner(System.in);
     7         while(input.hasNext()){
     8             String str = input.nextLine();
     9             //使用split方法分隔后统计
    10             int wordsCount = str.split(" ").length;
    11             System.out.println(str + " 单词数:" + wordsCount);
    12         }
    13     }
    14 }

    使用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"单词的前后没有空格,最后一个输入则没有把连写符号“'”考虑进去,这样统计出来的单词数量肯定错误一堆,那怎样才合理呢? 

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

     1 import java.util.Scanner;
     2 import java.util.regex.Matcher;
     3 import java.util.regex.Pattern;
     4 
     5 public class Client {
     6     public static void main(String[] args) {
     7         //接收键盘输入
     8         Scanner input = new Scanner(System.in);
     9         while (input.hasNext()) {
    10             String str = input.nextLine();
    11             //正则表达式对象
    12             Pattern pattern = Pattern.compile("\b\w+\b");//生成匹配器
    14             Matcher matcher = pattern.matcher(str);
    15             //记录单词数量
    16             int wordsCount = 0;
    17             //遍历查找匹配,统计单词数量
    18             while (matcher.find()) {
    19                 System.out.println(matcher.group());
    20                 wordsCount++;
    21             }
    22             System.out.println(str + " 单词数:" + wordsCount);
    23         }
    24     }
    25 }

    输出结果:

    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循环统计匹配的数量。 

    需要说明的是,在Java的正则表达式中""表示的是一个单词的边界,它是一个位置界定符,一边为字符或数字,另外一边则非字符或数字.

    例如"A"这样的一个输入就有两个边界,即单词"A"的左右位置,这也就说明了为什么要加上"w"(它表示的是字符或数字)

    三、建议 

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

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

     

     //==================================

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Client {
        public static void main(String[] args) {
            String c = "But I'm not dead yet!";
            Pattern pattern = Pattern.compile("[ [']]");
            Matcher matcher = pattern.matcher(c);
            for(String str:pattern.split(c)){
                System.out.print(str+" ");
            }
        }
    }

    输出:

    But I m not dead yet! 

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    BZOJ3674:可持久化并查集加强版
    BZOJ3772:精神污染
    BZOJ3932:[CQOI2015]任务查询系统
    BZOJ3123:[SDOI2013]森林
    BZOJ1926:[SDOI2010]粟粟的书架
    029 列表类型内置方法
    02 Python爬虫之盗亦有道
    01 Python爬虫之Requests库入门
    028 字符串类型内置方法
    027 数字类型内置方法
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5660260.html
Copyright © 2011-2022 走看看