<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2016字,需瀏覽 5分鐘

           ·

          2021-03-14 08:55

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

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

          SQL 解析原理

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

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

          select * from user;

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

           select * \n
          from   user;

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

          因此,想要設計一個通用性強的 SQL 解析引擎,首先要對字符串進行 預處理,將輸入的 SQL 語句標準化。比如去除回車、換行、冗余的空格和特殊字符等。

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

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

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

          首先我想到了兩種思路:

          1. 用循環(huán)語句順序掃描每個字符,通過當前字符和下一個字符判斷是否為 "\n",再移除。
          2. 直接用 Java 語言提供的 replaceAll 方法,傳入一個正則表達式,直接將完整字符串中所有匹配正則的子串替換為空串。

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

          Java 正則表達式定義:

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

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

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

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

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

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

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

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

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

          報錯

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

          無報錯

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

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

          那不妨試試這個正則表達式:

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

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

          用兩個反斜杠的效果

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

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

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

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


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

          ?? 點擊下方閱讀原文訪問資源


          往期推薦

          聊聊最近的生活

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

          提問的智慧



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

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  淫色址| 国产操逼在线 | 日本黄页视频 | 黄色小视频在线观看 | 九九九九九九视频 |