如何去除字符串中的 “\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;首先我想到了兩種思路:
我這里選擇后者,直接用現成的方法會比較方便,而且借助強大的正則表達式,可以同時替換掉多個冗余字符。
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% 的同学错了!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网IT行业,未来十年这些编程语言将大
- 下一篇: 网页的头部信息含义