最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

如何去除字符串中的 "\n" ?80% 的同學(xué)錯了!

2021-03-12 01:07 作者:程序員魚皮  | 我要投稿

大家好,我是魚皮,今天分享一個小知識。

我最近負(fù)責(zé)的工作是設(shè)計一個 SQL 解析引擎。簡單來說,就是將一個 SQL 表達(dá)式字符串,解析為一顆對象樹,從而執(zhí)行查詢等一系列操作。

SQL 解析原理

在最開始,我就遇到了一個很頭疼的問題,用戶編寫的 SQL 語句可能非常不標(biāo)準(zhǔn)!

理想的 SQL 語句,縮進(jìn)很規(guī)范,沒有多余的字符:

select?*?from?user;

而現(xiàn)實往往是這樣的:

?select?*?\n
from???user;

上述語句不僅縮進(jìn)、換行很隨意,還多了很多無意義的字符串,比如 "\n"

因此,想要設(shè)計一個通用性強(qiáng)的 SQL 解析引擎,首先要對字符串進(jìn)行 預(yù)處理,將輸入的 SQL 語句標(biāo)準(zhǔn)化。比如去除回車、換行、冗余的空格和特殊字符等。

那問題來了,如何去除字符串中的所有 "\n" 呢?注意,這里的 "\n" 并不是換行符,而是由字符 '\' 和字符 'n' 組成的字符串!

#?轉(zhuǎn)換前
select?*?\n?
from?user;

#?轉(zhuǎn)換后
select?*?from?user;

首先我想到了兩種思路:

  1. 用循環(huán)語句順序掃描每個字符,通過當(dāng)前字符和下一個字符判斷是否為 "\n",再移除。

  2. 直接用 Java 語言提供的 replaceAll 方法,傳入一個正則表達(dá)式,直接將完整字符串中所有匹配正則的子串替換為空串。

我這里選擇后者,直接用現(xiàn)成的方法會比較方便,而且借助強(qiáng)大的正則表達(dá)式,可以同時替換掉多個冗余字符。

Java 正則表達(dá)式定義:

/*
?*?全部替換
?*?regex?正則表達(dá)式
?*?replacement?要替換成的新串
?*/

public?String?replaceAll(String?regex,?String?replacement)?{
??return?Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

那么如何編寫正則表達(dá)式,移除所有的 "\n" 呢?這里我發(fā)起了一個投票,大家可以先自己想一下,給出自己的選擇。

大家的投票結(jié)果

剛開始我想的太簡單了,直接編寫出如下代碼:

str.replaceAll("\n",?"");

結(jié)果,并不能順利地替換掉字符串中的 "\n",僅僅是把換行符去掉了!

用單個反斜杠的結(jié)果

原因很簡單,在 Java 字符常量中,反斜杠(\)是一個特殊的字符,被稱為 轉(zhuǎn)義字符,它的作用是用來轉(zhuǎn)義后面一個字符,本身不具有實際意義!

因此,不能用下面這種方式直接輸出反斜杠:

報錯

如果想要單獨(dú)輸出一個反斜杠,需要再加上一個反斜杠轉(zhuǎn)義:

無報錯

同理,想要輸出一個 "\n" 字符串,代碼要這么寫:

System.out.println("\\n")

那不妨試試這個正則表達(dá)式:

str.replaceAll("\\n",?"");

結(jié)果出乎意料,竟然和只用一個反斜杠時的效果一樣!僅僅是移除了換行符。

用兩個反斜杠的效果

其實,正確的答案應(yīng)該是使用 四個反斜杠,因為反斜杠在 Java 和正則表達(dá)式中都是轉(zhuǎn)義字符!

其中,第一個斜杠是轉(zhuǎn)義符,第二個斜杠是斜杠本身,第三個斜杠又是轉(zhuǎn)義符,第四個斜杠是斜杠本身。

在 Java 中,輸出 "\n" 字符串需要兩個反斜杠和一個 'n',在 Java 的正則表達(dá)式中,要給這兩個反斜杠分別再分配一個反斜杠進(jìn)行轉(zhuǎn)義,才能生效。

總而言之,記住一句話:Java 正則表達(dá)式中,匹配一個反斜杠要用四個反斜杠!

最后,正則表達(dá)式可是一門大學(xué)問,推薦一款學(xué)習(xí)、創(chuàng)建和測試正則表達(dá)式的在線可視化工具,RegExr。通過練習(xí)的方式學(xué)習(xí),很快就能入門啦!

文章來源:https://mp.weixin.qq.com/s/rNDgr59UTcTCt5NtaLMnKQ


如何去除字符串中的 "\n" ?80% 的同學(xué)錯了!的評論 (共 條)

分享到微博請遵守國家法律
衡东县| 奎屯市| 富裕县| 东方市| 彩票| 武城县| 黄平县| 阜新| 伊宁县| 安宁市| 阜康市| 洪雅县| 腾冲县| 甘泉县| 白河县| 曲松县| 临潭县| 玉树县| 改则县| 安多县| 仁布县| 腾冲县| 巴林右旗| 北票市| 兴安盟| 阳江市| 蓬莱市| 梅河口市| 米泉市| 霞浦县| 襄垣县| 西乡县| 大方县| 怀集县| 桐庐县| 麦盖提县| 浦东新区| 阿合奇县| 葫芦岛市| 扶余县| 海南省|