zoukankan      html  css  js  c++  java
  • VI 正则表达式

    一 VI中如何使用正则表达式

    使用正则表达式的命令最常见的就是 / (搜索)命令。其格式如下:

    /正则表达式

    另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正则表达式替换成第二个//之间的字符串。

    :s/正则表达式/替换字符串/选项

    二、元字符

    元字符是具有特殊意义的字符。使用元字符可以表达任意字符行首行 尾某几个字符等意义。

    元字符一览

    元字符 说明
    . 匹配任意一个非空字符,不包括换行符
    [abc] 匹配方括号中的任意一个字符。可以使用-表示字符范围,
    [a-z0-9]匹 配小写字母和阿拉伯数字。
    [^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
    d 匹配阿拉伯数字,等同于[0-9]
    D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
    x 匹配十六进制数字,等同于[0-9A-Fa-f]
    X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
    w 匹配单词字母,等同于[0-9A-Za-z_]
    W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
    匹配<TAB>字符。
    s 匹配空白字符,等同于[   ],即空格和Tab
    S 匹配非空白字符,等同于[^ ]

    另外,如果要查找字符 *、.、/等,则需要在前面用  符号,表示这不是元字符,而只是普通字符而已。

    元字符 说明
    * 匹配 * 字符。
    . 匹配 . 字符。
    / 匹配 / 字符。
    \ 匹配 字符。
    [ 匹配 [ 字符。

    量词

    元字符 说明
    * 匹配0-任意个
    + 匹配1-任意个
    ? 匹配0-1个
    {n,m} 匹配n-m个
    {n} 匹配n个
    {n,} 匹配n-任意个
    {,m} 匹配0-m个

    表示位置的符号

    元字符 说明
    $ 匹配行尾
    ^ 匹配行首
    < 匹配单词词首
    > 匹配单词词尾

     

    例子:

    /chars+[A-Za-z_]w*; " 查找所有以char开头,之后是一个以上的空白," 最后是一个标识符和分号

    /dd:dd:dd " 查找如 17:37:01 格式的时间字符串

    :g/^s*$/d " 删除只有空白的行

    :s/<four>/4/g " 将所有的four替换成4,但是fourteen中的four不替换

    三、替换变量

    在正规表达式中使用 ( 和 ) 符号括起正规表达式,即可在后面使用12 等变量来访问 ( 和 ) 中的内容。

    使用例

    /a+[^a]+1                          //查找开头和结尾处a的个数相同的字符串," 如 aabbbaa,aaacccaaa,但是不匹配 abbbaa

    :s/http://[az. +/<a href="1">1</a>/              // 将URL替换为<a href="http://url">http://url</a>的格式

    :s/w+s+w+/2 1                                 //将 data1 data2 修改为 data2 data1

    四、函数式

    在替换命令 s/// 中可以使用函数表达式来书写替换内容,格式为

    :s/替换字符串/=函数式

    在函数式中可以使用 submatch(1)、submatch(2) 等来引用 12 等的内容,而submatch(0)可以引用匹配的整个内容。

    使用例

    :%s/<id>/=line(".") " 将各行的 id 字符串替换为行号

    :%s/^<w+>/=(line(".")-10) .".". submatch(1) " 将每行开头的单词替换为 (行号-10).单词 的格式, 如第11行的 word 替换成 1. word

    五、与Perl正则表达式的区别

    元字符的区别

    Vim语法 Perl语法 含义
    + + 1-任意个
    ? ? 0-1个
    {n,m} {n,m} n-m个
    (和) 分组

    六、常用vi 正则表达式

    :%s/^/Head content/g                   "全局插入开头信息
     :%s/$/Tail content/g                     "全局插入尾部信息 
     :%s= *$==                                     "将所有行尾多余的空格删除
     :g/^s*$/d                                        "将所有不包含字符(空格也不包含)的空行删除.

    :%s/ */ /g                    把一个或者多个空格替换为一个空格。

    :%s/ *$// 去掉行尾的所有空格。

    :%s/^/ / 在每一行头上加入一个空格。

    :%s/^[0-9][0-9]* // 去掉行首的所有数字字符。

    :%s/b[aeio]g/bug/g 将所有的bag、beg、big和bog改为bug。

    :%s/t([aou])g/h1t/g 将所有tag、tog和tug分别改为hat、hot和hug(注意用group的用法和使用1引用前面被匹配的字符)。

    七、关于magic

    vim中有个magic的设定。设定方法为:

    :set magic             " 设置magic
    :set nomagic           " 取消magic
    :h magic               " 查看帮助

    简单地说, magic就是设置哪些元字符要加反斜杠哪些不用加的。 简单来说:

    • magic(m):除了 $ . * ^ 之外其他元字符都要加反斜杠。
    • nomagic(M):除了 $ ^ 之外其他元字符都要加反斜杠。

    这个设置也可以在正则表达式中通过 m M 开关临时切换。 m 后面的正则表达式会按照 magic 处理,M 后面的正则表达式按照 nomagic 处理, 而忽略实际的magic设置。

    例如:

    /m.*          # 查找任意字符串
    /M.*          # 查找字符串 .* (点号后面跟个星号)
      

    另外还有更强大的 v 和 V。 * v(即 very magic 之意):任何元字符都不用加反斜杠 * V(即 very nomagic 之意):任何元字符都必须加反斜杠

    例如:

    /v(a.c){3}$   # 查找行尾的abcaccadc
    /m(a.c){3}$   # 查找行尾的(abc){3}
    /M(a.c){3}$   # 查找行尾的(a.c){3}
    /V(a.c){3}$   # 查找任意位置的(a.c){3}$

    默认设置是 magic,vim也推荐大家都使用magic的设置,在有特殊需要时,直接通过 vmMV 即可。

    vim的帮助文件非常有用,关于正则表达式可以参考以下的内容。

    :h pattern
    :h magic
    :h perl-patterns
  • 相关阅读:
    Atitit 趋势管理之道 attilax著
    Atitit 循环处理的新特性 for...else...
    Atitit 2017年的技术趋势与未来的大技术趋势
    atitit 用什么样的维度看问题.docx 如何了解 看待xxx
    atitit prj mnrs 项目中的几种经理角色.docx
    Atitit IT办公场所以及度假村以及网点以及租房点建设之道 attilax总结
    Atitit 工具选型的因素与方法 attilax总结
    Atitit.团队文化建设影响组织的的一些原理 法则 定理 效应 p826.v4
    Atiitt 管理方面的误区总结 attilax总结
    Atitit 未来趋势把控的书籍 attilax总结 v3
  • 原文地址:https://www.cnblogs.com/wangyongbin/p/4274081.html
Copyright © 2011-2022 走看看