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

我最近负责的工作是设计一个 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

如何去除字符串中的 "\n" ?80% 的同学错了!的更多相关文章

  1. 去除字符串中的html标记及标记中的内容

    去除字符串中的html标记及标记中的内容 --1.创建函数 create function [dbo].[clearhtml] (@maco varchar(8000)) returns varcha ...

  2. PHP中去除字符串中的换行的方法

    在PHP中,有时候我们需要对字符串的换行进行过滤,比如天涯PHP博客中文章页面的description信息,我是直接截取的文章内容,并过滤掉html符号,最终还要过滤掉其中的换行.下面整理一下常见的去 ...

  3. javascript 去除字符串中重复字符

    /** * 去除字符串中重复的字符,以下提供2种方法, * removeRepeat()为自己所想: * removeRepeat2()参考网上思路补充的 * removeRepeat3()敬请期待· ...

  4. js去除字符串中所有html标签及&nbsp符号

    近日在做项目的时候,经常会在页面上处理一些数据.结果发现自己js掌握的并不是很好.那就在这里记录js的点点滴滴吧. 1. 去除字符串中的 html 标签 function delHtmlTag(str ...

  5. python_如何去除字符串中不想要的字符?

    问题: 过滤用户输入中前后多余的空白字符 '    ++++abc123---    ' 过滤某windows下编辑文本中的'\r': 'hello world \r\n' 去掉文本中unicode组 ...

  6. 正则去除字符串中的html标签,但不去除<br>标签

    一.去除html标签 filterHTMLTag(msg) { var msg = msg.replace(/<\/?[^>]*>/g, ''); //去除HTML Tag msg ...

  7. Linux shell去除字符串中所有空格

    Linux shell去除字符串中所有空格 echo $VAR | sed 's/ //g'

  8. js去除字符串中的标签

    var str="<p>js去除字符串中的标签</p>"; var result=str.replace(/<.*?>/ig,"&qu ...

  9. 请求大神,C#如何截取字符串中指定字符之间的部分 按指定字符串分割 一分为二 c# 去除字符串中的某个已知字符

    string stra = "abcdefghijk";string strtempa = "c";string strtempb = "j" ...

  10. java 去html标签,去除字符串中的空格,回车,换行符,制表符

    public static String getonerow(String allLine,String myfind)     {                           Pattern ...

随机推荐

  1. efcore如何优雅的实现按年分库按月分表

    efcore如何优雅的实现按年分库按月分表 介绍 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖. ...

  2. 利用Django实现文件上传

    一.form表单的形式上传文件 1.路由 urlpatterns = [ path("upload/", views.UploadView.as_view(),) ] 2.视图 f ...

  3. CSS——组合选择器

    1.后代选择器(包括儿子和孙子) .c1 .c2{ color: red; } 2.子代选择器(只选择儿子) .c3 > .c5{ color: red; } 3.与选择器 选择p标签下面的.c ...

  4. SwiftUI(二)- 页面导航NavigationLink和Sheet窗口(模态视图)

    NavigationLink 官方文档对NavigationLink的定义: A button that triggers a navigation presentation when pressed ...

  5. 使用计算巢打造纯内网部署的PaaS服务

    私有化部署PaaS软件的公网访问需求 在阿里云计算巢,我们发现,很多本来应该只在VPC内网使用的三方PaaS软件和中间件,在部署时都开启了公网IP,这并不符合最佳实践. 以数据库为例,数据库保存了对企 ...

  6. redis RDB AOF数据持久化

    目录 redis RDB持久化[手工持久化]: redis RDB持久化条件配置[适合用于备份]redis rdb持久化策略 redis AOF持久化 redis AOF持久化配置 redis RDB ...

  7. Qt信号与槽的使用

    参考视频:黑马程序员https://www.bilibili.com/video/BV1XW411x7NU?p=4 1  新建工程 先创建一个控件基础工程,创建后的界面如下: 主函数我们不需要修改,就 ...

  8. react this指向问题

    在JSX事件函数方法中的 this,默认不会绑定 this指向.如果你忘记绑定,当你调用这个函数的时候 this 的值为 undefined.所以使用时一定要绑定好this的指向. 构造方法中绑定 c ...

  9. VMware搭建集群环境

    集群地址分配 名称 IP 子网掩码 网关 DNS flink01 192.168.22.211 255.255.255.0 192.168.22.2 114.114.114.114 flink02 1 ...

  10. 《Android开发卷——自定义日期选择器(一)》

    (小米手机) (中兴手机) 在实际开发中,Google官方提供的时间选择器API已经不能满足于我们的需要了,所以很多公司都是采用自定义的形式来实现日期选择器. 这个例子很简单,定义三个NumberPi ...