Vi Editor中的正则表达式应用
作者:张桂权
(摘自《 正则表达式袖珍手册》一书。译者,张桂权。可以从http://download.csdn.net/source/346896下载完整的译稿。如果感觉不错就去买一本原版的书吧,Regular Expression Pocket Reference,支持原书的作者。看PDF文件也是很累的。看完之后别忘了,给我提宝贵意见哦。谢谢。ajax.mailer@gmail.com)
vi程序是Unix系统上主流的文本编辑器。Vim是扩展了正则表达式支持的流行vi编辑器。两个都采用DFA匹配引擎。如果想进一步了解传统的DFA引擎背后的规则,请看“正则表达式和模式匹配”一节。
支持的元字符
vi支持表56到表60中列出来的元字符和元序列。关于每一个元字符的详述,请看“正则表达式元字符、模式和结构”一节。
vi字符表示 | |
序列名 | 序列描述 |
仅Vim(文本编辑器)支持 |
|
/b | 空格,/x08 |
/e | Esc字符,/x1B |
/n | 换行,/x 0A |
/r | 回车,/x0D |
/t | 水平制表符(tab),/x09 |
表56 vi字符表示
vi字符类和类似(class-like)结构 | |
字符类 | 类描述 |
[…] | 列出来的或包含在列表范围的单一字符 |
[^…] | 不在列出来的或不包含在列表范围的单一字符 |
[:class:] | POSIX风格的字符类(只有在regex字符类中有效) |
. | 除行终止(除非是单行模式,/s)之外的任意字符 |
仅Vim支持 |
|
/w | 字字符,[a-zA-Z0-9_] |
/W | 非字字符,[^a-zA-Z0-9_] |
/a | 字母,[a-zA-Z] |
/A | 非字母,[^a-zA-Z] |
/h | 字字符的开头,[a-zA-Z_] |
/H | 非字字符的开头,[^a-zA-Z_] |
/d | 数字字符,[0-9] |
表57 vi字符类和类似(class-like)结构
vi字符类和类似(class-like)结构(续) | |
字符类 | 类描述 |
/D | 非数字字符,[^0-9] |
/s | 空格字符,[ /t] |
/S | 非空格字符,[^ t] |
/x | 十六进制数,[a-fA-F0-9] |
/X | 非十六进制数,[^a-fA-F0-9] |
/o | 八进制数,[0-7] |
/O | 非八进制数,[^0-7] |
/l | 小写字母,[a-z] |
/L | 非小写字母,[^a-z] |
/u | 大写字母,[A-Z] |
/U | 非大写字母,[^A-Z] |
/i | 由isident定义的标识字符 |
/I | 任意非数字的标识字符 |
/k | 通常由语言模型设置,由iskeyword定义的键盘字符 |
/K | 任意非键盘字符 |
/f | 由isfname定义的文件名字符。依赖具体操作系统的实现。 |
/F | 任意非数字的文件名字符 |
/p | 由isprint定义的可打印字符。通常是x20-x7E |
表57 vi字符类和类似(class-like)结构(续)
vi锚和其他0宽测试 | |
序列名 | 序列描述 |
^ | 出现在正则表达式起始位置时,表示行的开头,否则匹配自身 |
$ | 出现在正则表达式末尾位置时,表示行的末尾,否则匹配自身 |
/< | 字边界的起始(比如,一个符号或空格字符和一个字字符) |
/> | 字边界的末尾 |
表58 vi锚和其他0宽测试
vi注释和模式转换器 | |
模式名 | 模式描述 |
:set ic | 为所有的搜索和替换启动大小写敏感模式 |
:set noic | 取消(关闭)大小写敏感模式 |
/u | 强制替换字符串中下一个字符为大写 |
/l | 强制替换字符串中下一个字符为小写 |
/U | 强制替换字符串中所有字符为大写 |
/L | 强制替换字符串中所有字符为小写 |
/E或/e | 终止一个从/U或/L开始的span |
表59 vi注释和模式转换器
vi归组、捕获、条件和控制 | |
序列 | 序列描述 |
/(.../) | 把子模式和捕获子匹配归到/1,/2,... |
/n | 包含第n个早被捕获的文本。在regex模式或替换字符串中能够有效 |
* | 匹配0或多次 |
| |
仅Vim支持 |
|
+ | 匹配1次或多次 |
/= | 匹配1次或0次 |
{n} | 匹配精确的n次 |
{n,} | 至少匹配n次 |
{,n} | 最多匹配n次 |
{x,y} | 至少匹配x次,最多y次 |
表60 vi归组、捕获、条件和控制
模式匹配
搜索
/pattern ?pattern
光标移动到文件中被pattern匹配的下一个位置。一个 ?pattern从后向前搜索。前向搜索时可用n键,重复搜索操作,但后向搜索时用N键来执行重复搜索。
替换
:[addr1[,addr2]]s/pattern/replacement/[cgp]
在address范围内用replacement来替换被pattern匹配的文本。如果没有指定位置范围(address),那么默认为当前行。每一个address既可以是一个行号,也可以是通用的行。如果指定了addr1,那么替换从指定的行开始(或者第一个匹配的行),到文件末尾为止,或由addr2指定的行(或匹配的)。下表是address的一些位置速记符。
替换选项 | |
选项 | 选项描述 |
C | 每个替换之前的提示 |
g | 替换一行内所有的匹配 |
p | 打印替换之后的行 |
位置速记符 | |
位置 | 相关描述 |
. | 当前行 |
$ | 文件最后一行 |
% | 整个文件 |
‘t | 位置t |
/...[/] | 下一个被pattern匹配的行 |
?...[?] | 前一个被pattern匹配的行 |
// | 下一个被最后搜索匹配的行 |
/? | 前一个被最后搜索匹配的行 |
/& | 下一个替换模式匹配的行 |
实例
实例35 vi中简单搜索
实例35 vi中简单搜索 |
Find spider-man, Spider-Man, Spider Man
/[Ss]pider[- ][Mm]an
|
实例36 Vim中简单搜索
实例36 Vim中简单搜索 |
Find spider-man, Spider-Man, Spider Man, spiderman, SPIDERMAN, etc.
:set ic /spider[- ]/=man
|
实例37 vi中简单替换
实例37 vi中简单替换 |
Globally convert <br> to <br /> for XHTML compliance.
:set ic : % s/<br>/<br //>/g
|
实例38 Vim中简单替换
实例38 Vim中简单替换 |
Globally convert <br> to <br /> for XHTML compliance.
: % s/<br>/<br //>/ig
|
实例39 Vim中高难度单替换
实例39 Vim中高难度单替换 |
Urlify: Turn URLs into HTML links
: % s//(https/=:[a-z_.//w#~:?+=&;%@!-]*/)/< a href=" /1">/1<//a>/ic
|
其他资源
l O’Reilly 出版Linda Lamb的著作《学习vi编辑器》第六版,是vi编辑器和流行的vi克隆编辑器的相关参考手册。
l Oleg Raisky, 有关Vim正则表达式语法概述, http://www.geocities.com/volontir/。