Vi Editor中的正则表达式应用

时间:2021-12-09 08:40:13

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/