专栏首页云前端正则表达式:在 Vim 中异于 Javascript 的用法

正则表达式:在 Vim 中异于 Javascript 的用法

对于前后端各种编程语言中的正则表达式,开发者们已经再熟悉不过了;但如果你在使用 vim 编辑器,同样会在命令模式下遇到需要用正则实现搜索替换的情景。

往往在此时你会发现,这里的正则语法和 Javascript 等语言中虽然大部分相同,但还是有些差异,用起来处于一种 “会,但不完全会” 的奇怪叠加态。

今天我们就来稍微归纳一下 vim 中较独特的正则语法,为更好地使用这种编辑神器厘清障碍。

本文适用于较熟悉正则表达式和 vim 编辑器的读者,入门选手推荐先阅读以下文章:

搜索和替换标记

除了 gi 之外,在 vim 中还可以使用 c,用来交互式地对匹配项逐个替换。

比如在命令模式下输入 :%s/cat/Dog/gc 后回车,会得到一个 replace with Dog (y/n/a/q/l/^E/^Y)? 的提示,按 y 就表示 yes 替换,按 n 表示 no 跳过等

贪婪模式和懒惰模式

贪婪模式:

  • * 匹配前面的字符 0 次或多次
  • \+ 匹配前面的字符 1 次或多次
  • \?\= 匹配前面的字符 0 次或 1 次
  • \{number} 精确匹配指定次数
  • \{min,max} 匹配前面的字符最少 min 次或最多 max 次

非贪婪模式:

  • \{-} 匹配前面的字符 0 次或多次,比如对于字符串 'This is a sample text':
    • /h.\{-}s 会匹配到 'his'
    • /h.*s 则匹配到 'his is a s'
  • \{-min,max} 尽可能少地匹配 min 次到 max 次,也就是满足条件情况下能 min 尽量不 max

特殊字符

除了常见的 \s\W 等,vim 中一些独特的字符匹配如下:

  • \a 匹配字母,即 [a-zA-Z]
  • \A 匹配非字母,即 [^a-zA-Z]
  • \l 匹配小写字母,即 [a-z]
  • \L 匹配非小写字母,即 [^a-z]
  • \u 匹配大写字母,即 [A-Z]
  • \U 匹配非大写字母,即 [^A-Z]
  • \x 匹配十六进制字符,即 [0-9a-fA-F]
  • \X 匹配非十六进制字符,即 [^0-9a-fA-F]

多匹配和捕获模式

  • \| 可以用来匹配两个或更多个关键词
    • 比如 /abc\|123 会匹配到 'abc' 或 '123'
  • \(pattern\) 可以建立捕获分组,在替换段落中则用 \1, \2 依次表示捕获到的分组

单词边界

  • \<pattern 匹配单词的开始边界
  • pattern\> 匹配单词的结束边界
  • \<pattern\> 精确匹配整个单词

搜索模式调整符

  • \v 用来简化限定符、分组等里面的 \ 符号
    • /\vc{5} 精确匹配 'ccccc'
    • /\vabc+ 匹配 'abc' 或 'abccc'
    • /\vabc? 匹配 'ab' 或 'abc'
    • /\v<his> 精确匹配整个单词 '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 使得匹配特殊字符时不用 \ 符号
    • /V^.* 精确匹配字符串 ^.\*
  • \c 忽略大小写搜索
  • \C 大小写敏感搜索
  • \%V 只对可视模式下光标选中的范围进行替换
    • s/\%Vcat/dog/g 会把选中范围内的 'cat' 换成 'dog'
    • 在可视模式按 ESC 变为命令模式时,命令输入行会自动生成 '<,'>,要先删去这一部分

替换并改变大小写

在替换段落中,可以使用以下符号

  • \u 将后面的一个字符变为大写
    • :% s/\v(\a+)/\u\1/g 会将文件中的所有英文单词变为首字母大写
    • :% s/\v(\w)_(\a+)/\1\u\2/g array_sum 变成 'arraySum'
  • \U 将后面的所有字符变为大写
    • :% s/\v(\a+)/\U\1/g 会将文件中的所有英文单词变为全大写
  • \l 将后面的一个字符变为小写
  • \L 将后面的所有字符变为小写

自定义分隔符

为了避免在搜索替换时使用过多的 / 所造成的混乱,可以使用诸如 #^$ 这样的其他符号替换 /,比如:

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

参考资料

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

本文分享自微信公众号 - 云前端(fewelife),作者:云前端

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • javascript当中正则表达式用法

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

    马克java社区
  • javascript当中正则表达式用法

    6.正则表达式 例 6.1(replaceIEFF.html) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Tr...

    马克java社区
  • JavaScript中的正则表达式

    两者的区别:如果使用new来创建那么需要对正则表达式进行转义如\d需要转义为\\d,\\需要转义为\\\\。

    kai666666
  • JavaScript中的正则表达式

    版权声明:本文为原创文章发布于公众号:Modeng , 你可以随意转载但请务必注明出处!!!https://blog.csdn.net/qq_32135281/...

    六小登登
  • 常用正则表达式锦集与Python中正则表达式的用法

    1、常用正则表达式 最简单的正则表达式是普通字符串,只能匹配自身 '[pjc]ython'可以匹配'python'、'jython'、'cython' '[a-...

    Python小屋屋主
  • JavaScript之常用的正则表达式

    校验数字 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|...

    laixiangran
  • 正则表达式在js中的使用

    test() 正则对象方法,用于检测字符串是否符合该规则,该对象会返回 true 或 false,其参数是测试字符串。

    清出于兰
  • 正则表达式在 ES2018 中的新写法 [每日前端夜话0x25]

    摘要:如果你曾用 JavaScript 做过复杂的文本处理和操作,那么你将会对 ES2018 中引入的新功能爱不释手。 在本文中,我们将详细介绍第 9 版标准如...

    疯狂的技术宅
  • JavaScript基础之七——JavaScript中的正则表达式

        正则表达式在前端开发中应用十分广泛,从表单验证到内容替换,正则多发挥着十分重要的作用。JavaScript中提供了专门的正则对象。

    珲少
  • 常用的JavaScript验证正则表达式

    匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

    大师级码师
  • 常用的JavaScript验证正则表达式

    匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

    用户7108768
  • Python正则表达式的用法

    3.创建一个匹配对象,然后通过该对象获得匹配细节(Create an object with details about how the regex matc...

    py3study
  • [Go] 在golang中使用正则表达式捕获子表达式

    正则匹配并且可以捕获到()这个里面的子表达式的值,linux的grep命令没办法捕获子表达式的值,只能获取到整条正则匹配的内容

    陶士涵
  • Linux 中几个正则表达式的用法

    正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列。拥有强大的字符搜索功能。也非常方便的搜索过滤出我们想要的内容。

    民工哥
  • Linux 中几个正则表达式的用法

    正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列。拥有强大的字符搜索功能。也非常方便的搜索过滤出我们想要的内容。

    杰哥的IT之旅
  • Linux中几个正则表达式的用法

    链接:https://www.linuxmi.com/linux-zhengzebiaodashi.html

    用户6543014
  • JavaScript之我在正则表达式里踩的坑

    以为就是走个流程,然而懵了:输出结果是-1. 半天也没找出错在哪里。 然后误打误撞下整出了下面的代码:

    宸寰客
  • Python3中正则表达式使用方法

    崔庆才,Python技术控,爬虫博文访问量已过百万。喜欢钻研,热爱生活,乐于分享。

    生信宝典
  • Vim中查找替换及正则表达式的使用详解

    正则表达式是文本处理领域中的一个强大的工具,它可以让文本处理的能力呈指数级的提升,如果一款文本编辑器不支持正则表达式,那么它就算不上是一个现代化的编辑器,这绝非...

    砸漏

扫码关注云+社区

领取腾讯云代金券