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 |
换行,/x0A |
/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/。