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

我最近负责的工作是设计一个 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. R语言str_trim函数去除字符串中头部和尾部的空格

    R语言str_trim函数去除字符串中头部和尾部的空格 目录 R语言str_trim函数去除字符串中头部和尾部的空格 #导入包和库 #仿

  2. java字符串复制空值_Java脚本:去除字符串中空值

    /** * @title 去除以','作为分隔符的字符串中的空值 *         从数据库中获取的个别字段,当其值为',"***","***"," ...

  3. 去除字符串中所有的逗号

    arrBusiType.replace(/,/g, "");//去除字符串中所有的逗号 s_raise_end_date.replace(/-/g, "")// ...

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

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

  5. 去除字符串中的指定字符

    去除字符串中的 - 符号: 其实也就是将原本想要去除的字符替换为空而已. String str = "sdfsd-sdfsdf-sdfvsds-fsdfzxv"; String s ...

  6. java字符串去重复_java去除字符串中重复、不重复、消除重复后字符

    java去除字符串中重复.不重复.消除重复后字符 import java.util.HashSet; import java.util.Set; public class Main { public ...

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

    Linux shell去除字符串中所有空格 echo $VAR | sed 's/ //g' 转载于:https://www.cnblogs.com/yjd_hycf_space/p/9839494. ...

  8. go去掉最后一个字符_Go语言去除字符串中的指定字符

    Go语言中常用的去除字符串中指定字符的方法如下表所示. 表:字符串处理函数 方法功能描述 func Trim(s string, cutset string) string 将字符串 s 首尾包含在 ...

  9. java:去除字符串中空格 、 oracle (+) 、 mysql中数值运算符和函数

    java:去除字符串中空格 http://www.cnblogs.com/LiuChunfu/p/5661810.html oracle:oracle (+) https://zhidao.baidu ...

最新文章

  1. spring mvc 控制器方法传递一些经验对象的数组
  2. 从头开始安装Ubuntu,cuda,cudnn,caffe,tensorflow,ROS
  3. Cookie和Session-学习笔记04【Session之验证码案例】
  4. codevs 1557 热浪
  5. android edittext 不可编辑
  6. 框架中建立浮动框架_建立代理,而不是框架
  7. java hashmap 的api_JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)
  8. mybatis 映射成多个list_SSM:Mybatis架构与原理
  9. 随想录(B+树的实现)
  10. 51Nod 1092 回文字符串(LCS + dp)
  11. MySql Workbench常用快捷键修改MySqlWorkBench快捷键
  12. collector_使用Data Collector监视SQL Server性能
  13. jQuery 根据数组对象中的属性值删除当前对象
  14. 项目中css初始化通用代码(源码,直接套)
  15. SQL Prompt 没激活联网后突然无法使用 解决办法
  16. python批量打印mathcad_全能批量打印工具-兼容所有打印机
  17. Rayman的绝顶之路——Leetcode每日一题打卡12
  18. react-router-dom v6 使用
  19. matlab正序零序负序,正序负序零序的理解
  20. CIW认证题库-页面设计与制作

热门文章

  1. c#网页自动化脚本语言,c# – 创建用于创建网页的脚本语言
  2. dubbo的端口地址和ip写在那_开源一款超实用的 Dubbo 测试工具,已用半年,感觉很有feel~...
  3. dijkstra算法matlab程序_Dijkstra算法例子
  4. javascript中BOM介绍、屏幕尺寸、历史记录、URL解析、计算机信息获取、定时器、三大系列及兼容代码、封装动画函数、同步和异步
  5. java i线程安全吗_Java中 i++ 是线程安全的么?为什么?
  6. mysql11导入数据_MySQL专题11之MySQL导出数据、MySQL导入数据
  7. mybatis的缓存机制是怎么样的?
  8. 互联网晚报 | 3月3日 星期四 |​ 苹果将于北京时间3月9日凌晨2点举办春季发布会;vivo子品牌NEX被砍掉...
  9. 2021年Q2母婴行业季度洞察报告
  10. PRD的编写竟然暗含这个思路