• vim正则表达式(转)


    Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操作。

    如果你比较熟悉Perl的正规表达式,可以直接参照与Perl正则表达式的区别一节。

    一、使用正则表达式的命令

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

    /正则表达式

    另一个很有用的命令就是 :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 匹配空白字符,等同于[ ]
    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://[-a-z._~+%/]+)/<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 正则表达式练习

    闲言碎语不要讲…例子说明一切,比如下面这段我需要换成 ubb 标签

    vim 命令模式,输入

    :%s/.*src=”([^"]*)”[^>]*>/[img]1[/img]/g

    替换为

    [img ]gu.jpg[ /img]

    [img ]os.jpg[ /img]

    [img ]hu.jpg[ /img]

    [img ]ang.jpg[ /img]

    解释如下:

    :

    命令执行状态

    %s

    表示查找并替换

    %s/a/b/g

    a 被查找的字符串(正则匹配);b 要替换成的文字;g 表示全局搜索替换(否则只处理找到的第一个结果)

    ([^"]*)

    表示非引号的字符N个;外面 () 表示后面替换要用(用 1,…,9等引用)

    [/img]

    / 需要被 转义

    与其它工具正则不一样的地方在于 () 也必须 (),怪不得我老是弄不出来。

    相关资料:

    via http://net.pku.edu.cn/~yhf/tao_regexps_zh.html

    vi 命令 作用

    :%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引用前面被匹配的字符)。

    Sed

    Sed是Stream EDitor的缩写,是Unix下常用的基于文件和管道的编辑工具,可以在手册中得到关于sed的详细信息。

    这里是一些有趣的sed脚本,假定我们正在处理一个叫做price.txt的文件。注意这些编辑并不会改变源文件,sed只是处理源文件的每一行并 把结果显示在标准输出中(当然很容易使用重定向来定制):

    sed脚本 描述

    sed ’s/^$/d’ price.txt 删除所有空行

    sed ’s/^[ ]*$/d’ price.txt 删除所有只包含空格或者制表符的行

    sed ’s/”//g’ price.txt 删除所有引号

  • 相关阅读:
    Codeforces 877 C. Slava and tanks
    Codeforces 877 D. Olya and Energy Drinks
    2017 10.25 NOIP模拟赛
    2017 国庆湖南 Day1
    UVA 12113 Overlapping Squares
    学大伟业 国庆Day2
    51nod 1629 B君的圆锥
    51nod 1381 硬币游戏
    [JSOI2010]满汉全席
    学大伟业 2017 国庆 Day1
  • 原文地址:https://www.cnblogs.com/PegasusWang/p/3153300.html
Copyright © 2020-2023  润新知