如何去除字符串中的 "\n" ?80% 的同学错了!
大家好,我是鱼皮,今天分享一个小知识。
我最近负责的工作是设计一个 SQL 解析引擎。简单来说,就是将一个 SQL 表达式字符串,解析为一颗对象树,从而执行查询等一系列操作。

在最开始,我就遇到了一个很头疼的问题,用户编写的 SQL 语句可能非常不标准!
理想的 SQL 语句,缩进很规范,没有多余的字符:
select * from user;
而现实往往是这样的:
select * \n
from user;
上述语句不仅缩进、换行很随意,还多了很多无意义的字符串,比如 "\n" !
因此,想要设计一个通用性强的 SQL 解析引擎,首先要对字符串进行 预处理,将输入的 SQL 语句标准化。比如去除回车、换行、冗余的空格和特殊字符等。
那问题来了,如何去除字符串中的所有 "\n" 呢?注意,这里的 "\n" 并不是换行符,而是由字符 '\' 和字符 'n' 组成的字符串!
# 转换前
select * \n
from user;
# 转换后
select * from user;
首先我想到了两种思路:
- 用循环语句顺序扫描每个字符,通过当前字符和下一个字符判断是否为
"\n",再移除。 - 直接用 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% 的同学错了!的更多相关文章
- 去除字符串中的html标记及标记中的内容
去除字符串中的html标记及标记中的内容 --1.创建函数 create function [dbo].[clearhtml] (@maco varchar(8000)) returns varcha ...
- PHP中去除字符串中的换行的方法
在PHP中,有时候我们需要对字符串的换行进行过滤,比如天涯PHP博客中文章页面的description信息,我是直接截取的文章内容,并过滤掉html符号,最终还要过滤掉其中的换行.下面整理一下常见的去 ...
- javascript 去除字符串中重复字符
/** * 去除字符串中重复的字符,以下提供2种方法, * removeRepeat()为自己所想: * removeRepeat2()参考网上思路补充的 * removeRepeat3()敬请期待· ...
- js去除字符串中所有html标签及 符号
近日在做项目的时候,经常会在页面上处理一些数据.结果发现自己js掌握的并不是很好.那就在这里记录js的点点滴滴吧. 1. 去除字符串中的 html 标签 function delHtmlTag(str ...
- python_如何去除字符串中不想要的字符?
问题: 过滤用户输入中前后多余的空白字符 ' ++++abc123--- ' 过滤某windows下编辑文本中的'\r': 'hello world \r\n' 去掉文本中unicode组 ...
- 正则去除字符串中的html标签,但不去除<br>标签
一.去除html标签 filterHTMLTag(msg) { var msg = msg.replace(/<\/?[^>]*>/g, ''); //去除HTML Tag msg ...
- Linux shell去除字符串中所有空格
Linux shell去除字符串中所有空格 echo $VAR | sed 's/ //g'
- js去除字符串中的标签
var str="<p>js去除字符串中的标签</p>"; var result=str.replace(/<.*?>/ig,"&qu ...
- 请求大神,C#如何截取字符串中指定字符之间的部分 按指定字符串分割 一分为二 c# 去除字符串中的某个已知字符
string stra = "abcdefghijk";string strtempa = "c";string strtempb = "j" ...
- java 去html标签,去除字符串中的空格,回车,换行符,制表符
public static String getonerow(String allLine,String myfind) { Pattern ...
随机推荐
- next-route
在目录结构中,我们精心创建的每一个文件最终都会经过处理,转化为相应的页面路由.然而,值得注意的是,某些特殊文件格式在生成过程中并不会被当作路由路径来处理. app |-auth login page. ...
- 【开源】2024最新python豆瓣电影数据爬虫+可视化分析项目
项目介绍 [开源]项目基于python+pandas+flask+mysql等技术实现豆瓣电影数据获取及可视化分析展示,觉得有用的朋友可以来个一键三连,感谢!!! 项目演示 [video(video- ...
- c++ 记一次把qrencode源码生成动态库的尝试
在网上搜二维码库:qrencode,源码下载:https://github.com/fukuchi/libqrencode 我的是windows环境,IDE是vs2022. 建立一个动态库的空工程. ...
- 【Sqlserver】查看所有数据库的大小 创建日期 名称 版本级别 状态
EXEC sp_helpdb
- HTML——img标签
在HTML中,图像由标签定义的,它可以用来加载图片到html网页中显示.网页开发过程中,有三种图片格式被广泛应用到web里,分别是 jpg.png.gif. img标签的属性: /* src属性: 指 ...
- 人脸识别库 虹软 客户端 服务端 示例 基于虹软SDK在C/S 模式下的多人脸实时识别(C#)
https://github.com/18628271760/MultipleFacesProcess 一.前言 虹软开发SDK以来,其免费使用的营销策略,成功降低了中小企业使用人脸识别技术的成本.然 ...
- 鸿蒙极速入门(三)-TypeScript语言简介
ArkTS是HarmonyOS优选的主力应用开发语言.ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集.因此,在学习ArkTS语言之 ...
- Docker环境如何配置?使用阿里云OOS一步搞定!
背景介绍 系统运维管理OOS及扩展程序 系统运维管理OOS(CloudOps Orchestration Service)针对在阿里云ECS实例上部署应用和驱动的复杂性,特别设计了扩展程序,旨在简化用 ...
- THUWC 2024 游记
其实这个游记也没啥好写的-- day 0 上午做动车两个小时到重庆,路上玩了 1.5h 的星露谷. 下午去巴蜀中学报道试机,系统是 Ubuntu Jammy,大大的好评,只是桌面是 Xubuntu/X ...
- INFINI Easysearch 与华为鲲鹏完成产品兼容互认证
何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云.私有云.混合云.桌面云)推出的一项合作伙伴计划,旨在为构建持续发展.合作共赢的鲲鹏生态圈,通过整合华为的技术.品牌资源,与合作伙伴共享商 ...