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>

        正則表達(dá)式:在 Vim 中異于 Javascript 的用法

        共 2071字,需瀏覽 5分鐘

         ·

        2021-08-22 10:06


        對(duì)于前后端各種編程語(yǔ)言中的正則表達(dá)式,開(kāi)發(fā)者們已經(jīng)再熟悉不過(guò)了;但如果你在使用 vim 編輯器,同樣會(huì)在命令模式下遇到需要用正則實(shí)現(xiàn)搜索替換的情景。

        往往在此時(shí)你會(huì)發(fā)現(xiàn),這里的正則語(yǔ)法和 Javascript 等語(yǔ)言中雖然大部分相同,但還是有些差異,用起來(lái)處于一種 “會(huì),但不完全會(huì)” 的奇怪疊加態(tài)。

        今天我們就來(lái)稍微歸納一下 vim 中較獨(dú)特的正則語(yǔ)法,為更好地使用這種編輯神器厘清障礙。

        本文適用于較熟悉正則表達(dá)式和 vim 編輯器的讀者,入門(mén)選手推薦先閱讀以下文章:

        搜索和替換標(biāo)記

        除了 g、i 之外,在 vim 中還可以使用 c,用來(lái)交互式地對(duì)匹配項(xiàng)逐個(gè)替換。

        比如在命令模式下輸入 :%s/cat/Dog/gc 后回車,會(huì)得到一個(gè) replace with Dog (y/n/a/q/l/^E/^Y)? 的提示,按 y 就表示 yes 替換,按 n 表示 no 跳過(guò)等

        貪婪模式和懶惰模式

        貪婪模式:

        • * 匹配前面的字符 0 次或多次
        • \+ 匹配前面的字符 1 次或多次
        • \?\= 匹配前面的字符 0 次或 1 次
        • \{number} 精確匹配指定次數(shù)
        • \{min,max} 匹配前面的字符最少 min 次或最多 max 次

        非貪婪模式:

        • \{-} 匹配前面的字符 0 次或多次,比如對(duì)于字符串 'This is a sample text':
          • /h.\{-}s 會(huì)匹配到 'his'
          • /h.*s 則匹配到 'his is a s'
        • \{-min,max} 盡可能少地匹配 min 次到 max 次,也就是滿足條件情況下能 min 盡量不 max

        特殊字符

        除了常見(jiàn)的 \s\W 等,vim 中一些獨(dú)特的字符匹配如下:

        • \a 匹配字母,即 [a-zA-Z]
        • \A 匹配非字母,即 [^a-zA-Z]
        • \l 匹配小寫(xiě)字母,即 [a-z]
        • \L 匹配非小寫(xiě)字母,即 [^a-z]
        • \u 匹配大寫(xiě)字母,即 [A-Z]
        • \U 匹配非大寫(xiě)字母,即 [^A-Z]
        • \x 匹配十六進(jìn)制字符,即 [0-9a-fA-F]
        • \X 匹配非十六進(jìn)制字符,即 [^0-9a-fA-F]

        多匹配和捕獲模式

        • \| 可以用來(lái)匹配兩個(gè)或更多個(gè)關(guān)鍵詞
          • 比如 /abc\|123 會(huì)匹配到 'abc' 或 '123'
        • \(pattern\) 可以建立捕獲分組,在替換段落中則用 \1, \2 依次表示捕獲到的分組

        單詞邊界

        • \<pattern 匹配單詞的開(kāi)始邊界
        • pattern\> 匹配單詞的結(jié)束邊界
        • \<pattern\> 精確匹配整個(gè)單詞

        搜索模式調(diào)整符

        • \v 用來(lái)簡(jiǎn)化限定符、分組等里面的 \ 符號(hào)
          • /\vc{5} 精確匹配 'ccccc'
          • /\vabc+ 匹配 'abc' 或 'abccc'
          • /\vabc? 匹配 'ab' 或 'abc'
          • /\v<his> 精確匹配整個(gè)單詞 'his'
          • /\vmin|max 匹配 'min' 或 'max'
          • /\vhand(y|ful) 匹配 'handy' 或 'handful'
          • /\v(\a)\1 匹配 'aa' 'bb' 'cc' 等
          • s/\v(\d+) (\d+)/\2 \1/ 將 '123 99' 替換為 '99 123'
        • \V 使得匹配特殊字符時(shí)不用 \ 符號(hào)
          • /V^.*$ 精確匹配字符串 ^.\*$
        • \c 忽略大小寫(xiě)搜索
        • \C 大小寫(xiě)敏感搜索
        • \%V 只對(duì)可視模式下光標(biāo)選中的范圍進(jìn)行替換
          • s/\%Vcat/dog/g 會(huì)把選中范圍內(nèi)的 'cat' 換成 'dog'
          • 在可視模式按 ESC 變?yōu)槊钅J綍r(shí),命令輸入行會(huì)自動(dòng)生成 '<,'>,要先刪去這一部分

        替換并改變大小寫(xiě)

        在替換段落中,可以使用以下符號(hào)

        • \u 將后面的一個(gè)字符變?yōu)榇髮?xiě)
          • :% s/\v(\a+)/\u\1/g 會(huì)將文件中的所有英文單詞變?yōu)槭鬃帜复髮?xiě)
          • :% s/\v(\w)_(\a+)/\1\u\2/g array_sum 變成 'arraySum'
        • \U 將后面的所有字符變?yōu)榇髮?xiě)
          • :% s/\v(\a+)/\U\1/g 會(huì)將文件中的所有英文單詞變?yōu)槿髮?xiě)
        • \l 將后面的一個(gè)字符變?yōu)樾?xiě)
        • \L 將后面的所有字符變?yōu)樾?xiě)

        自定義分隔符

        為了避免在搜索替換時(shí)使用過(guò)多的 / 所造成的混亂,可以使用諸如 #^$ 這樣的其他符號(hào)替換 /,比如:

        • :% s#/project/adder/#/verilog/project/high_speed_adder/#g

        參考資料

        • https://learnbyexample.gitbooks.io/vim-reference/content/Regular_Expressions.html



        瀏覽 74
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(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>
            宝贝腿开大点我添添公视频免 | 日本18禁视频 | 西西人体大胆瓣开腿自慰 | 日本东京热无码视频免费 | 男男gay互吃鳮吧吞精小说 | 少妇把腿扒开让我爽爽视频 | 超碰91大香蕉 | 天天综合激情 | 四虎国产精品久久 | 男生jj插女生 |