本文转载自微信公众号「程序员鱼皮」,何去作者 鱼皮。除字转载本文请联系程序员鱼皮公众号。符串 大家好,何去我是除字鱼皮,今天分享一个小知识。符串 我最近负责的何去工作是设计一个 SQL 解析引擎。简单来说,除字就是符串将一个 SQL 表达式字符串,解析为一颗对象树,何去从而执行查询等一系列操作。除字 SQL 解析原理 在最开始,符串我就遇到了一个很头疼的何去问题,用户编写的除字 SQL 语句可能非常不标准! 理想的 SQL 语句,缩进很规范,符串没有多余的字符: 而现实往往是这样的: 上述语句不仅缩进、换行很随意,还多了很多无意义的字符串,比如 "\n" ! 因此,想要设计一个通用性强的 SQL 解析引擎,首先要对字符串进行 预处理,将输入的源码库 SQL 语句标准化。比如去除回车、换行、冗余的空格和特殊字符等。 那问题来了,如何去除字符串中的所有 "\n" 呢?注意,这里的 "\n" 并不是换行符,而是由字符 \ 和字符 n 组成的字符串! 首先我想到了两种思路: 我这里选择后者,直接用现成的方法会比较方便,而且借助强大的正则表达式,可以同时替换掉多个冗余字符。 Java 正则表达式定义: 刚开始我想的太简单了,直接编写出如下代码: 结果,并不能顺利地替换掉字符串中的云服务器提供商 "\n",仅仅是把换行符去掉了! 用单个反斜杠的结果 原因很简单,在 Java 字符常量中,反斜杠(\)是一个特殊的字符,被称为 转义字符,它的作用是用来转义后面一个字符,本身不具有实际意义! 因此,不能用下面这种方式直接输出反斜杠: 报错 如果想要单独输出一个反斜杠,需要再加上一个反斜杠转义: 无报错 同理,想要输出一个 "\n" 字符串,代码要这么写: 那不妨试试这个正则表达式: 结果出乎意料,竟然和只用一个反斜杠时的效果一样!仅仅是移除了换行符。 用两个反斜杠的效果 其实,正确的答案应该是使用 四个反斜杠,因为反斜杠在 Java 和正则表达式中都是转义字符! 其中,第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠又是转义符,网站模板第四个斜杠是斜杠本身。 在 Java 中,输出 "\n" 字符串需要两个反斜杠和一个 n,在 Java 的正则表达式中,要给这两个反斜杠分别再分配一个反斜杠进行转义,才能生效。 总而言之,记住一句话:Java 正则表达式中,匹配一个反斜杠要用四个反斜杠!