任何一个现代编辑器或编程语言,如果不支持正则表达式,则可考虑立刻放弃,因为正则表达式不仅仅只是高效,还有点身份地位象征的意味。
正则表达式指使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。如果用vi而不懂正则表达式,则等于根本不会用。正则表达式是vi处理文本最有力的武器,稍微上点“档次”的编辑器或语言都支持正则表达式。花点时间学习正则表达式是跟普通程序员拉开距离的捷径。
正则表达式至少可以做到以下事情:
注:正则表达式有很多种实现,各版本之间有些诧异,但基础构成方面都是一样的,学习使用的时候要加以区分。
可理解为关键字或保留字,这些字符做特殊用途
| 字符 | 解释 |
|---|---|
| . | 匹配换行符以外的任意字符 |
| ^ | 匹配字符串的开始位置 |
| $ | 匹配字符串的结束位置 |
| * | 匹配前面的子表达式零次或多次,等价于{0,} |
| + | 匹配前面的子表达式一次或多次,等价于{1,} |
| ? | 匹配前面的子表达式零次或一次,等价于{0,1} |
| \ | 转义符,将特殊字符进行转义 |
| [] | [abc]字符集合,匹配所包含的任意一个字符 |
| [^abc]负值字符集合,匹配未包含的任意字符 | |
| [a-z] 字符范围,匹配指定范围内的任意字符 | |
| () | 两个字符一起使用,用于创建一个用于匹配的子串,也叫分组 |
| {} | {n}匹配确定的n次 |
| {n,}至少匹配n次,等价于"*" | |
| {n,m}最少匹配n次且最多匹配m次(其中n<=m) |
还有| 交替匹配,符号两边的任意一项
| 字符 | 解释 |
|---|---|
| \b | 单词边界,同\< |
| \B | 非单词边界,同 \> |
| \d | 数字字符,同 [0-9] |
| \D | 非数字字符,同[^0-9] |
| \s | 空白字符,同 [ \t\n\r\f\v] |
| \S | 非空白字符,同 [^\t\n\r\f\v] |
| \w | 字母数字字符,同 [a-zA-Z0-9_] |
| \W | 非字母数字字符,同 [^a-zA-Z0-9_] |
| \t | Tab,同0x09 |
| \r | 回车符,同0x0D |
| \n | 换行符,同0x0A |
| \f | 换页符 |
| \v | 垂直制表符,同ox0b |
| \x | 十六进制,例如“x41”匹配“A” |
| \u | Unicode字符。例如,u00A9匹配版权符号 |
| 字符 | 解释 |
|---|---|
| [:alnum:] | 匹配任意一个字母或数字字符 |
| [:alpha:] | 匹配任意一个字母字符(包括大小写字母) |
| [:blank:] | 空格与制表符(横向和纵向) |
| [:digit:] | 匹配任意一个数字字符 |
| [:lower:] | 匹配小写字母 |
| [:upper:] | 匹配大写字母 |
| [:punct:] | 匹配标点符号 |
| [:space:] | 匹配一个包括换行符、回车等在内的所有空白符 |
| [:graph:] | 匹配任何一个可以看得见的且可以打印的字符 |
| [:xdigit:] | 任何一个十六进制数(即:0-9,a-f,A-F) |
| [:cntrl:] | 任何一个控制字符(ASCII字符集中的前32个字符) |
| [:print:] | 任何一个可以打印的字符 |
^[1-9]d*$^-[1-9]d*$^-?[1-9]d*$^[1-9]d*|0$^-[1-9]d*|0$^[1-9]d*.d*|0.d*[1-9]d*$^-([1-9]d*.d*|0.d*[1-9]d*)$^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$[u4e00-u9fa5]^[u4e00-u9fa5],{0,}$^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$^http(s)://([w-]+.)+[w-]+(/[w-./?%&=]*)?$^((d{3,4})|d{3,4}-)?d{7,8}$[1-9]d{5}(?!d)^d{15}|d{18}$^s*|s*$w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*[a-zA-z]+://[^s]*d+.d+.d+.d+^[0-9]*$^d{n}$^d{n,}$^d{m,n}$^(0|[1-9][0-9]*)$^[0-9]+(.[0-9]{2})?$^[0-9]+(.[0-9]{1,3})?$^+?[1-9][0-9]*$^-[1-9][0-9]*$^.{3}$^[A-Za-z]+$^[A-Z]+$^[a-z]+$^[A-Za-z0-9]+$^w+$^[a-zA-Z][a-zA-Z0-9_]{4,15}$^(0?[1-9]|1[0-2])$正确格式为:“01”-“09”和“1”“12”^((0?[1-9])|((1|2)[0-9])|30|31)$
基本表达式: [range]s/from/to/[flags]
:1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换;
:10s/from/to/ 表示只在第10行搜索替换;
:%s/from/to/ 表示在所有行中搜索替换;
:1,$s/from/to/ 同上。
c confirm,每次替换前询问;
e error, 不显示错误;
g globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;
i ignore,忽略大小写。
:%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g:%s/abc.*/abc asd/g%s/^\d.*$//g:%s/^[a|b|c].*$//g:%s/<c-v><c-m>//g:s/\(http:\/\/[-a-z\._~\+%\/]\+\)/<a href="\1">\1<\/a>/:%s/\<id\>/\=line("."):%s/ */ /g:%s/ *$//g:%s/^ *//g:g/^\s*$/d:g/string/d:v/string/d:%s#<{FNXX==XXFN}\+>##g:%s/^\(.*\)\n\1$/\1/g:%s/^/ /g:%s/b[e|s|i].*g/bug/g:%s/^/#/每行开头添加#号:3,10s/^/#/ 3-10行每行开头添加#号原文地址:http://blog.csdn.net/nyist327/article/details/45223443