正则表达式
什么是正则表达式?正则表达式只是一个字符模板,用来在搜索中匹配相同的字符,在大多数程序中,正则表达式是括在正斜线中间的。例如,/love/就是一个以正斜杠为分割符的正则表达式,其中的模板love将用在搜索所有行中于它匹配的字符。
:1,$s/<[Tt]tom>/David/g
这行命令的意思是“从文件的第一行到文件的最后一行(1,$)替换(s)单词Tom或者tom为David”。g(global)标志表示这个命令对全文有效。正则表达式元字符<和>/分别界定单词的开始和结束。
正则表达式有两套字符集,一套是基本元字符集,另一套是扩展元字符集。
正则表达是的元字符集
元字符 | 功能 | 例子 | 匹配什么 |
^ | 锚定行的开始 | /^love/ | 匹配所有以love开头的行 |
$ | 锚定行的结束 | /love$/ | 匹配所有以love 结束的行 |
. | 匹配一个字符 | /l..e/ | 匹配这样的行,这些行包含这样的字符:第一个字符是l,紧跟着两个字符,然后是e |
* | 代表0个或多个先前字符 | /*love/ | 匹配所有这样的行,有0个或多个空格,空格后跟着love |
[] | 匹配字符组中的一个字符 | /[Ll]ove/ | 匹配所有包含love或者Love的行 |
[x-y] | 匹配以字符范围组成的组中的一个字符 | /[A-Z]ove/ | 匹配这样的行,这些行中包含如下字符,第一个字符是从A到Z中间的一个,后面跟着ove |
[^] | 匹配一个不在范围内的字符 | /[^A-Z]ove/ | |
用来转义一个元字符 | /love./ | 匹配所有这样的行,这些行包含如下字符:love后面跟着一个点。通常点是表示任何字符的通配符 |
许多使用RE元字符集的UNIX程序都支持附加元字符集。
< | 锚定单词的开始 | / | 匹配所有这样的行,这些行包含以love开头的单词(vi和grep支持这个功能) |
> | 锚定单词的结束 | /love>/ | 匹配所有这样的行,这些行包含以love结束的单词(vi和grep支持这个功能) |
(..) | 标记后面用到的匹配字符(传) | /(love)able1rs/ | 最多可以使用9个标签。第一个标签是模板最左边的部分。在本例子中,模板love保存的标签为1,后面的1指得就是love;本例子搜索的是这样的行,这些行包含这样的字符,在Loveabel后面跟着lovers |
x{m}or | M次复制字符x | | |
x{m,}or | 至少m次复制字符x | | |
x{m,n} | 至少m次,至多n次复制字x | o{5,10} | 匹配所有这样的行,包含的o的数量在5到10个之间。(vi和grep支持这个功能) |
几个例子:
/^[A-Z]..$/
需要在每一行中寻找的字符串是这样的:这个字符串是一行的开始且的第一个字符是一个大写字母,后面紧跟着两个任意字符,然后是新的一行。
/^[A-Z][a-z ]*[0-5]/
需要在每一行中寻找的字符串是这样的:这个字符串是一行的开始,第一个字符是一个大写字母,紧跟着0个和多个小写字母,然后是数字3,再后面是一个介于0和5之间的数字。
/[a-z]*./
0个和多个小写字母,后面紧跟着一个点号。
/^*[A-Z][a-z][a-z]$/
这个字符串是一行的开始,它首先是0个或者多个空格(注意,制表符不算是一个空格),然后是一个大写字母和两个小写字母,紧跟着是新的一行。
/^[A-Za-z]*[^,][A-Za-z]*$/
这个字符串是一行的开始,字符串的开头是0个或多个大写字母或(和)小写字母,紧跟着一个只要不是逗号的字符,然后是0个和多个大写字母或者小写字母,以及新的一行。
/
搜索的是所有包含单词fourth的行
/
搜索的字符串是这样的:以字母f开头,紧跟着0个或多个任意字符(.*),最终以th结束。
/5{2}2{3}./
首先是2个5,紧跟着是3个2,最后是一个点(.)。