星期一, 四月 24, 2017

VIM学习笔记 magic选项

magic选项

默认情况下,magic选项是打开的。如果关闭了此选项,那么正则表达式中的许多的特殊字符就失去了他们神奇的魔力,而变成了普通的字符。

我们使用以下只有一行的文件来测试magic选项。先用:%print命令将整个文件打印出来:

Test aaa* aa* a*

然后设置magic选项并且执行替换命令。其中,p标记打印出所改变的行:

:set magic

:1 substitute /a*/b/p

命令的执行结果如下:

bTest aaa* aa* a*

命令只是改变了一行开始的部分。为什么会将Test变为b*Test呢?这是因为*可以匹配0次或是多次,而Test正是以0个a开始的。为什么只是替换了一次呢?这是因为:substitute命令中是改变第一个出现的地方,如果我们使用g标记就可以替换全部的匹配项了。如果希望g标记成为默认设置,那么可以使用:set gdefault命令。

我们撤销刚才的命令并再次执行替换命令:

:undo

:1 substitute /a*/b/pg

命令的执行结果如下:

bTest b*b b*b b*

如果在关闭magic选项的情况下再次执行命令:

:undo

:set nomagic

:1 substitute /a*/b/pg

命令的执行结果如下:

Test aab ab b

smgic命令

:smagic命令,可以在执行替换命令时强制转换*等特殊字符的意义。例如我们执行以下命令:

:smagic /a*/b/pg

命令的执行结果如下:

bTest b*b b*b b*

:snomagic命令,强行关掉magic选项:

:snomagic /a*/b/pg

命令的执行结果如下:

Test aab ab b


命令小结
:set magic打开magic选项
:set nomagic关闭magic选项
:smagic强制使用magic选项
:snomagic强制禁用magic选项

Ver: 1.0<上一篇 | 目录 下一篇>

星期三, 四月 19, 2017

VIM学习笔记 正则表达式-基础(Regular Expression Basic)

Vim使用正则表达式(regular expressions)来进行逻辑查找。正则达式是神秘和简洁的,然而这种强大的功能也必须要以大量的学习才能够习惯和掌握。

一个正则表达式是由一些元素组成的,一个元素可以是一个字符或者是一个特殊字符。

以下表格列示了常用的简单元素:

x字符x
^一行的开始处
$ 一行的结尾处
.任意单个字符
<开始标记
>结尾标记

行首与行尾

^acme,将匹配以acme开始的行。注意:除非出现在模式的开头,否则音调符号^就不是一个代表行开头的通配符,而会代表其他的含义。2^4,将匹配包含"2^4"的所有行。如果要查找以“^”开头的行,则需要使用^^模式。其中第一个^是通配符用于指示一行的开头,而第二个^则是实际的音调符号。如果要指明前导^是一个实际的音调符号而不是表示一行开头的通配符,那么就需要在其前面加一个转义的反斜杠“\”来组成\^acme模式。

RegularExpression_BeginOfLine

acme$,将匹配以acme结尾的行。^acme$,将匹配只包含acme一个单词的行。而^$,则会匹配所有空行。

RegularExpression_EndOfLine

dog.bone,将匹配dog-bone,dog bone,dog/bone,但不会匹配dogbone,因为dog和bone之间并没有分隔符。

RegularExpression_AnySingleChr

要指示任何字符出现的次数,可以同时使用句点和星号(.*),例如dog.*bone将匹配以下字符串(但不会匹配dog在一行而bone在另一行的情况):

dogbone
dog-bone
doggy bone
My dog has a bone

词首与词尾

<用于匹配一个单词的开始。>用于匹配一个单词的结束。也就是说,只要将想要查找的字符串包围其中,就可以实现精确查找。例如在文件中有单词Californian和Unfortunately。如果使用命令/for来查找,那么也会找到这两个单词。

RegularExpression_Partial

如果使用表达式/\<for\>来进行查找,则只会精确的查找到for,而不会出现其他的匹配。

RegularExpression_Exact

匹配次数

星号(*)通配符,作用于其之前的一个元素,表示可以匹配0次或是多次。表达式的贪婪(greedy)特性,将尝试查找尽可能多的匹配项。te*将会匹配te,tee,teee等等。甚至还会匹配t,因为在这里e可以出现0次。

RegularExpression_Asterisk

加号(+)通配符,表示一个字符可以匹配一次或是多次。所以表达式te\+可以匹配te,tee,teee等等。但是不会再匹配t,因为这里e最少要出现一次。

RegularExpression_Plus

等号(=)通配符,表示一个字符匹配0次或是一次。所以表达te\=可以匹配t和te,但是不会匹配tee,因为这个表达式只能匹配不多于两个字符。

RegularExpression_Equal

Ver: 1.0<上一篇 | 目录 下一篇>