当前位置: 首页 > 科技观察

如何从字符串中删除“-n”?

时间:2023-03-15 09:53:08 科技观察

本文转载自微信公众号《程序员鱼皮》,作者鱼皮。转载本文请联系程序员Yupi公众号。大家好,我是Yupi,今天给大家分享一个小知识。我最近的工作是设计一个SQL解析引擎。简单来说,就是将一个SQL表达式字符串解析成一个对象树,进行查询等一系列操作。SQL解析的原理一开始遇到了一个很头疼的问题。用户写的SQL语句可能很不规范!理想的SQL语句,缩进很规范,没有多余的字符:select*fromuser;但现实往往是这样的:select*\nrouser;上面的语句不仅缩进换行自如,而且还有很多无意义的字符串,比如“\n”!因此,如果要设计一个通用的SQL分析引擎,首先要对字符串进行预处理,并对输入的SQL语句进行标准化处理。比如去除回车、换行、多余空格和特殊字符等。问题来了,如何去除字符串中的所有“\n”?注意这里的“\n”不是换行符,而是字符'\'和字符'n'组成的字符串!#conversionBeforeselect*\nfromuser;#Afterconversionselect*fromuser;首先想到了两个思路:用循环语句依次扫描每一个字符,通过当前字符和下一个字符判断是否为“\n”,然后去掉。直接使用Java语言提供的replaceAll方法,传入一个正则表达式,将完整字符串中所有匹配该正则表达式的子字符串直接替换为空字符串。我这里选择后者。直接使用现成的方法更方便,并且借助强大的正则表达式,可以同时替换多个冗余字符。Java正则表达式定义:/**替换所有*regex正则表达式*替换为新字符串*/publicStringreplaceAll(Stringregex,Stringreplacement){returnPattern.compile(regex).matcher(this).replaceAll(replacement);}一开始觉得太简单了,直接写了如下代码:str.replaceAll("\n","");角色被删除!使用单个反斜杠的原因很简单。在Java字符常量中,反斜杠(\)是一种称为转义字符的特殊字符。它的作用是转义后面的字符,本身没有实际意义!所以,不能直接用下面的方式输出反斜杠:报错如果要输出单个反斜杠,需要加反斜杠转义:不会报错同理,想输出一个“\n”字符串,代码应该写成这样:System.out.println("\\n")然后试试这个正则表达式:str.replaceAll("\\n","");令人惊讶的是,它与仅使用一个反斜杠时的效果相同!仅删除换行符。使用两个反斜杠的效果其实正确答案应该是使用四个反斜杠,因为反斜杠在Java和正则表达式中是转义字符!其中,第一条斜线是转义符,第二条斜线是斜线本身,第三条斜线又是转义符,第四条斜线是斜线本身。在Java中,输出一个“\n”字符串需要两个反斜杠和一个'n'。在Java的正则表达式中,需要为两个反斜杠各分配一个反斜杠进行转义。生效。总而言之,记住一句话:在Java正则表达式中,四个反斜杠用来匹配一个反斜杠!