• 如何去除字符串中的 "\n" ?80% 的同学错了!


    大家好,我是鱼皮,今天分享一个小知识。

    我最近负责的工作是设计一个 SQL 解析引擎。简单来说,就是将一个 SQL 表达式字符串,解析为一颗对象树,从而执行查询等一系列操作。

    SQL 解析原理

    在最开始,我就遇到了一个很头疼的问题,用户编写的 SQL 语句可能非常不标准!

    理想的 SQL 语句,缩进很规范,没有多余的字符:

    select * from user;
    

    而现实往往是这样的:

     select * \n
    from   user;
    

    上述语句不仅缩进、换行很随意,还多了很多无意义的字符串,比如 "\n"

    因此,想要设计一个通用性强的 SQL 解析引擎,首先要对字符串进行 预处理,将输入的 SQL 语句标准化。比如去除回车、换行、冗余的空格和特殊字符等。

    那问题来了,如何去除字符串中的所有 "\n" 呢?注意,这里的 "\n" 并不是换行符,而是由字符 '\' 和字符 'n' 组成的字符串!

    # 转换前
    select * \n 
    from user;
    
    # 转换后
    select * from user;
    

    首先我想到了两种思路:

    1. 用循环语句顺序扫描每个字符,通过当前字符和下一个字符判断是否为 "\n",再移除。
    2. 直接用 Java 语言提供的 replaceAll 方法,传入一个正则表达式,直接将完整字符串中所有匹配正则的子串替换为空串。

    我这里选择后者,直接用现成的方法会比较方便,而且借助强大的正则表达式,可以同时替换掉多个冗余字符。

    Java 正则表达式定义:

    /*
     * 全部替换
     * regex 正则表达式
     * replacement 要替换成的新串
     */
    public String replaceAll(String regex, String replacement) {
      return Pattern.compile(regex).matcher(this).replaceAll(replacement);
    }
    

    那么如何编写正则表达式,移除所有的 "\n" 呢?这里我发起了一个投票,大家可以先自己想一下,给出自己的选择。

    大家的投票结果

    刚开始我想的太简单了,直接编写出如下代码:

    str.replaceAll("\n", "");
    

    结果,并不能顺利地替换掉字符串中的 "\n",仅仅是把换行符去掉了!

    用单个反斜杠的结果

    原因很简单,在 Java 字符常量中,反斜杠(\)是一个特殊的字符,被称为 转义字符,它的作用是用来转义后面一个字符,本身不具有实际意义!

    因此,不能用下面这种方式直接输出反斜杠:

    报错

    如果想要单独输出一个反斜杠,需要再加上一个反斜杠转义:

    无报错

    同理,想要输出一个 "\n" 字符串,代码要这么写:

    System.out.println("\\n")
    

    那不妨试试这个正则表达式:

    str.replaceAll("\\n", "");
    

    结果出乎意料,竟然和只用一个反斜杠时的效果一样!仅仅是移除了换行符。

    用两个反斜杠的效果

    其实,正确的答案应该是使用 四个反斜杠,因为反斜杠在 Java 和正则表达式中都是转义字符!

    其中,第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠又是转义符,第四个斜杠是斜杠本身。

    在 Java 中,输出 "\n" 字符串需要两个反斜杠和一个 'n',在 Java 的正则表达式中,要给这两个反斜杠分别再分配一个反斜杠进行转义,才能生效。

    总而言之,记住一句话:Java 正则表达式中,匹配一个反斜杠要用四个反斜杠!


    最后,正则表达式可是一门大学问,推荐一款学习、创建和测试正则表达式的在线可视化工具,RegExr。通过练习的方式学习,很快就能入门啦!

    文章来源:https://mp.weixin.qq.com/s/rNDgr59UTcTCt5NtaLMnKQ

  • 相关阅读:
    asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用
    asp.net core系列 75 Elasticsearch与中文分词配置
    asp.net core系列 74 Exceptionless服务端安装
    nginx for windows
    asp.net core系列 73 Exceptionless+Nlog以及Apollo介绍
    asp.net core系列 72 Exceptionless使用介绍
    asp.net core系列 71 Web架构分层指南
    asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅
    asp.net core系列 69 Amazon S3 资源文件上传示例
    asp.net core系列 68 Filter管道过滤器
  • 原文地址:https://www.cnblogs.com/yupi/p/14521576.html
Copyright © 2020-2023  润新知