分享

vim中的正则表达式

 fym0121 2010-10-28

记性不好,才一段时间不用发现vim 的东西忘的差不多了。要重新熟悉才行。现从正则表达式开始,用惯了JavaPython 的正则表达式,再用Linux 的正则表达式还真有点不习惯,而且grepvim 的正则表达式有些微区别,grepegrep 的正则表达式也有一点区别。用用之前要好好想想才行,太恶心了。

今天现把VIM 的正则表达式整理一些,过几天整理grep 的。(补充:grep的正则表达式在元字符方面和vi差不多,不整理了)

 

vim 的正则表达式的有两种模式,magicnomagic ,两种模式下,元字符是不一样的。可以通过set mogicset nomagic 进行选择,默认是magic 。建议不要乱设置,就用magic 模式差不多。也可以再Pattern 指定用magicnomagic ,这里不废话了,下面列出常用的magic 的表达式。
在vi命令行模式下输入:
:1, $s/tom/David/g
 ^   ^  ^    ^   ^
 |   |  |    |   |---- global 对全文有效
 |   |  |    |
 |   |    |--------- 将tom 替换为 David , 使用正则表达式.
 |   |------- 替换单词
 |------ 从文件的第一行到文件的最后一行. 

表:
----------------------------------------------------------------------------------------------
  元字符      | 功能            |  例子         |  匹配什么
  ----------------------------------------------------------------------------------------------
  ^      | 锚定行的开始         | /^love/   |  匹配所有以love开头的行.
  ----------------------------------------------------------------------------------------------
  $      | 锚定行的结束         | /love$/   |  匹配所有以love结束的行.
  ----------------------------------------------------------------------------------------------
  .      | 匹配一个字符         | /l..e/   |  匹配这样的行, 这些行包含这样的字符,
      |            |      |第一个字符是 l,紧跟着两个字符,然后是e.
  -----------------------------------------------------------------------------------------------
  *      | 代表0个或多个先前字符      | /*love/   |  匹配这样的行, 有0个或者多个空格,空格
      |            |      |候跟着love
  -----------------------------------------------------------------------------------------------
  []      | 匹配字符组中的一个字符      | /[lL]ove/   |  匹配所有包含love or Love 的行
  -----------------------------------------------------------------------------------------------
  [x-y]      | 匹配以字符范围组成的组中的一个字符   | /[A-Z]ove   |  匹配所有这样的行, 这些行包含如下字符
      |            |      |第一个字符是从A到Z 中间的一个, 后面跟
      |            |      |着ove
  -----------------------------------------------------------------------------------------------
  [^]      | 匹配一个不在范围内的字符      | /[^A-Z]ove/   |  匹配所有这样的行, 这些行包含如下字符
      |            |      |第一个字符不是从A到Z 中间的一个, 后面
      |            |      |跟着ove
  -----------------------------------------------------------------------------------------------
  \      | 用来转义一个字符         | /love\./   |  匹配所有这样的行, 这些行包含如下字符
      |            |      |love 后面跟着一个点, 通常点是表示任何
      |            |      |字符的通配符.
  -----------------------------------------------------------------------------------------------
  \<       | 锚定单词的开始         | /\<love/   |  匹配所有这样的行, 这些行包含以love
      |            |      |开头的单词 (vi & grep 都支持这个功能)
  -----------------------------------------------------------------------------------------------
  \>      | 锚定单词的结束         | /<love\>   |  ... ^ ... 以love结束的单词 ... ^
  -----------------------------------------------------------------------------------------------
  \(..\)   | 标记后面用到的匹配字符      | /\(love\)a\1b | 最多可以使用9个标签. 第一个标签是模板
      |            |      |最左边的部分. 在这例子中, 模板love
      |            |      |保存为标签1, 后面的\1指的就是love;
      |            |      |本例子搜索的是这样的行, 这些行包含这样
      |            |      |的字符,在lovea 后面跟着loveb.
 ------------------------------------------------------------------------------------------------
 [NOTE: 各种版本的Unix 以及模板匹配 (pattern-matching) 实用程序并不都是可信赖的, 通常我们使用 vi & grep]

 

对前一个模式的次数匹配

\*

0 到多次,尽可能多匹配

\+

1 到多次,尽可能多匹配

\=

01 次,尽可能多匹配

\?

01 次,尽可能多匹配

\{n,m}

nm 词,尽可能多匹配

\{n}

n 次,尽可能多匹配

\{n,}

至少n 次,尽可能多匹配

\{,m}

0m 次,尽可能多匹配

\{}

0 到多次,尽可能多匹配(和\* 一样)

\{-n,m}

nm 次,尽可能少匹配

\{-n}

n

\{-n,}

至少n 次,尽可能少匹配

\{-,m}

至多m 次,尽可能少匹配

\{-}

0 到多次,尽可能少匹配

 

位置匹配

^

行开头

\_^

行开头

$

行末尾

\_$

行末尾

.

换行之外的任何字符

\_.

单个字符,包括换行符

\<

单词开始

\>

单词结束

\%^

文件开头

\%$

文件结束

\%V

可视化区域内部

\%#

光标位置

\%'m

标记点m,m 可以自己定义的标记点( 使用'm)

\%nl

匹配第n 行,n 是一个数字

\%nc

匹配第n 列,n 是一个数字

常用预定义字符

\i

标识符字符,如字母数字下划线等

\I

\i 相似,但不包括数字

\f

文件名字符

\F

类似\f ,但不包括数字

\p

可打印字符

\P

类似\p ,但不包括数字

\s

空白字符

\S

非空白字符

\d

数字[0-9]

\D

非数字[^0-9]

\x

16 进制字符[0-9a-fA-F]

\X

16 进制字符

\o

八进制字符[0-7]

\O

非八进制字符

\w

字母[a-zA-Z_0-9]

\W

非字母

\h

单词开头字符,比\w 少了数字

\H

非单词开头字符

\a

字母表字符[a-zA-Z]

\A

非字母表字符

\l

小写字母

\L

非小写字母

\u

大写字母

\U

非大写字符

\_x

X 是上面字符中的一个,\_x\x 多匹配一个换行符

\t

<Tab>

\n

换行符

\1 \2 \3

n 个捕获的组\(\)

 

其他

\(\)

组捕获

\%(\)

非捕获组,和\(\) 类似,但不捕获

\|

分支

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多