1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        如何去除字符串中的 "\n" ?

        共 2016字,需瀏覽 5分鐘

         ·

        2021-03-14 08:55

        大家好,我是魚皮,今天分享一個(gè)小知識(shí)。

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

        SQL 解析原理

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

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

        select * from user;

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

         select * \n
        from   user;

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

        因此,想要設(shè)計(jì)一個(gè)通用性強(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)語句順序掃描每個(gè)字符,通過當(dāng)前字符和下一個(gè)字符判斷是否為 "\n",再移除。
        2. 直接用 Java 語言提供的 replaceAll 方法,傳入一個(gè)正則表達(dá)式,直接將完整字符串中所有匹配正則的子串替換為空串。

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

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

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

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

        那么如何編寫正則表達(dá)式,移除所有的 "\n" 呢?大家可以先自己想一下,歡迎參與投票~

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

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

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

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

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

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

        報(bào)錯(cuò)

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

        無報(bào)錯(cuò)

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

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

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

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

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

        用兩個(gè)反斜杠的效果

        其實(shí),正確的答案應(yīng)該是使用 四個(gè)反斜杠,因?yàn)榉葱备茉?Java 和正則表達(dá)式中都是轉(zhuǎn)義字符!

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

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

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


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

        ?? 點(diǎn)擊下方閱讀原文訪問資源


        往期推薦

        聊聊最近的生活

        用 Git 操作的數(shù)據(jù)庫?這個(gè)項(xiàng)目火了!

        提問的智慧



        您好,我是魚皮,20 屆本科畢業(yè)加入騰訊,是一名熱愛分享技術(shù)干貨的全棧工程師。
        在校期間帶工作室建設(shè)幾十個(gè)網(wǎng)站,拿過國家獎(jiǎng)學(xué)金、挑戰(zhàn)杯國獎(jiǎng)、上海市優(yōu)秀畢業(yè)生,也曾在字節(jié)跳動(dòng)實(shí)習(xí),有段創(chuàng)業(yè)經(jīng)歷,并成功落戶上海。
        未來很長,希望能和大家共同進(jìn)步,作為職場萌新,虛心接受前輩點(diǎn)化。
        感謝您的關(guān)注,歡迎添加我的微信 liyupi66 交流。
        創(chuàng)作不易,請給魚皮加個(gè)星標(biāo)點(diǎn)贊、在看 支持哦!
        瀏覽 51
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            北条麻妃无码在线观看 | 国产三级精品片 | 男男激情video欧美猛男 | 爱99区区 | 青青国产精品视频 | 美女露出让男生揉免费 | 三级黄色小视频 | 黄污视频在线看 | 俺去俺来也在线www色情网 | 国产一级a毛一级a毛视频在线网站 |