Ref:
一、对应《正则表达式30分钟入门教程》
deerchao的《正则表达式30分钟入门教程》我读过好几遍,可以说是极好的学习正则表达式的入门文章。我常用的文本编辑器是Vim,具有强大的查找功能。不过,Vim的表示方式和《正则表达式30分钟入门教程》有些不同。这遍文章对应教程,把不同部分列出来,作为备份。
说明:相同的就不列出来了。
序号
入门教程
Vim
备注
1
\b是正则表达式规定的一个特殊代码……代表着单词的开头或结尾,也就是单词的分界处
没有直接对应的。
\<,表示单词的起始;
\>,表示单词的结
要查找单词hi,要用 \
2
+则匹配重复1次或更多次
\{1,} 1 或更多,同 \+
\d+匹配1个或更多连续的数字,Vim用 \d\+
3
? 重复零次或一次
\{0,1} 0 或 1,同 \=
4
\(?0\d{2}[) -]?\d{8}
这个表达式可以匹配几种格式的电话号码
\(\=0\d\{2}[) -]\=\d\{8}
5
如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开
在一个查找模式中,"或" 运算符是 "\|"
6
\b(\w+)\b\s+\1\b
可以用来匹配重复的单词
\<\(\w\+\)\s\+\1\>
7
\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分)
\<\w\+\(ing\)\@=
Vim称为:零宽度匹配前面的匹配原
8
(?<=\bre)\w+\b 会匹配以re开头的单词的后半部分(除了re以外的部分)
\(\
零宽度反向匹配。要求前面的匹配原紧贴在后面的模式之前匹配
9
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)
\(\(\d\)\@<=\d\{3}\)\+\>
10
(?<=\s)\d+(?=\s)匹配以空白符间隔的数字
\(\s\)\@<=\d\+\(\s\)\@=
11
匹配包含后面不是字母u的字母q的单词
\b\w*q(?!u)\w*\b
\<\w*q\(u\)\@!\w*\>
零宽度否匹配,亦即,要求前面的匹配原在当前位置_不_匹配
12
\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字
\d\{3}\(\d\)\@!
13
\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词
\<\(\(\(abc\)\@!\)\w\)\+\>
14
(?
\([a-z]\)\@
零宽度反向否匹配,要求前面的匹配原_不_紧贴在其后的模式之前匹配
15
(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容
\(<\3>\)\@<=.*\(<\/\(\w\+\)>\)\@=
表达式写出来 了,验证可用,但不明白为什么是\3。
二、其它实例
实例1: 密码验证:由且仅由数字、字母(大小写)组成,两者缺一不可,密码不少于6位。
实例4:把[a 1]替换为[1]
注:[a 1]] 中,a、1之间是tab。
实例五:匹配所有汉字
我无法做到,只能通过迂回的方式来达到。
正则表达式:[^\x00-\x7f]\+
表示非ASCII码的集合,包括汉字。
((?<=\d)\d{3})+\b
正则表达式: ^\(.*\d\)\@=\(.*[a-z]\)\@=[a-z0-9]\{6,}$
实例2: 十位的数字、字母组合密码,其中包含4位数字和6位字母。
正则表达式: ^\(.*\d.*\d.*\d.*\d.*\)\@=\(.*[a-z].*[a-z].*[a-z].*[a-z].*[a-z].*[a-z].*\)\@=[a-z0-9]\{10}$
正则表达式:%s/\(^.*\)/\1<\/A>/g
正则表达式:%s/\(^.\{-}\)\t\(.\{-}$\)/\2<\/A>/g
%s/\(^.\{-}\)\t\(.*\)/\2<\/A>/g
