<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>

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

          共 2071字,需瀏覽 5分鐘

           ·

          2021-08-22 10:06


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

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

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

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

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

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

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

          貪婪模式和懶惰模式

          貪婪模式:

          • * 匹配前面的字符 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

          特殊字符

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

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

          多匹配和捕獲模式

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

          單詞邊界

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

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

          • \v 用來簡化限定符、分組等里面的 \ 符號(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 忽略大小寫搜索
          • \C 大小寫敏感搜索
          • \%V 只對(duì)可視模式下光標(biāo)選中的范圍進(jìn)行替換
            • s/\%Vcat/dog/g 會(huì)把選中范圍內(nèi)的 'cat' 換成 'dog'
            • 在可視模式按 ESC 變?yōu)槊钅J綍r(shí),命令輸入行會(huì)自動(dòng)生成 '<,'>,要先刪去這一部分

          替換并改變大小寫

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

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

          自定義分隔符

          為了避免在搜索替換時(shí)使用過多的 / 所造成的混亂,可以使用諸如 #^$ 這樣的其他符號(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)
          <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>
                  天天躁夜夜躁av 无码视频中文字幕 | 日韩免费网站 | 国产特黄三级片 | 国产六区 | 人人鲁人人爱 |