之前一篇博文正则表达式 入门讲了下正则表达式的一些基本使用,这次讲一下高级的。还是那句话,要多用,才能够记住并留在你的大脑皮层。
1. 匹配一个或多个连续字符
用+符号, a+,意思是匹配1个或多个字符a;[0-9]+,意思是匹配一个或多个数字
在vim中 + 语法有点不同,要用 '\+',如左示例。
note:[\w.] == [\w\.],像. + 这样的元字符,在字符集中可以不转义,但是转义一下也没问题。
* 用法跟+相同,但是匹配0个或多个连续字符
匹配0或多个数字,然后跟着abc三个字母
? 匹配0个或1个字符(或字符集合)
?在vim中的语法也有点不同,要写成 '\?',如左示例
另外,可以用{}来设置重复次数,例如
a{9} 匹配连续9个a
[0-9]{9} 匹配连续9个数字字符
{2} 重复2次
{2,4} 重复2-4次
{2,} 重复至少2次,无上限
注意{}的用法在vim中也有点不同,左{前要加一个‘\’.
元字符的贪婪型和懒惰型版本
* *?
+ +?
{n,} {n,}?
上面是一个例子,左边是贪婪模式,右边本来的正则应该是<[Bb]>.*?<\/[Bb]>,但是好像vim不支持,就找了上面途中所示的方法,效果是一样的,{-}的意思是最短匹配,注意{}在vim中的用法,要加一个\,再看下第3个例子,帮助理解。
2. 位置匹配
\b 匹配一个单词的开头或末尾
\< 匹配一个单词的开头 不是所有的编辑器都支持
\> 匹配一个单词的结束
要注意下3个匹配结果的不同,另外,\b不被vim支持,所以只能用后面两种形式。
字母数字下划线是作为单词边界的字符,因此那个+符号,其实跟空格没啥区别。
^ 匹配一个字符串的开头
$ 匹配一个字符串的结束
很多正则表达式的实现都支持使用一些特殊的元字符去改变另外一些元字符的行为,用来启动分行匹配模式的(?m)记号就是其中一个例子。分行匹配模式使得正则表达式引擎把行分隔符当作一个字符串分隔符来对待。
在分行匹配模式下,^ 不仅匹配正常的字符串开头,还将匹配行分隔符(换行符)后的开始位置(这个位置不可见);类似地,$ 不仅匹配正常的字符串结尾,还将匹配行分隔符(换行符)后面的结束位置。
在使用时,(?m)必须出现在整个模式的最前面,例如下面的例子:
3. 使用子表达式
attention:
把必须匹配的情况考虑周全并写出一个匹配结果符合预期的正则表达式很容易,但把不需要匹配的情况也考虑周全并确保它们都将被排除在匹配结果之外往往要困难得多
上面的两条正则的匹配结果是一样的,但是右边的实例使用了子表达式。
'|'是正则里的'或'运算符
上面两个例子,右边的将19|20作为一个子表达式,左边的正则'|'将其两边的部分作为整体来看待,看成了19和20\d{2},因此左图中之匹配到了19而不是完整的1988.
精确匹配ip,只有0-255才可以的,有下面几种情况:
1)任何一个1位或2位数字
2)任何一个以1开头的3位数字
3)任何一个以2开头,第2位数字在0-4之间的3位数字
4)任何一个以25开头,第3位数字在0-5之间的3位数字
我擦,构造了一个有点长的正则表达式,给哥们来了个下面这个提示。
那条正则:\(\(\(\d\{1,2}\)\|\(1\d\{2}\)\|\(2[0-4]\d\)\|\(25[0-5]\)\)\.\)\{3}\(\(\d\{1,2}\)\|\(1\d\{2}\)\|\(2[0-4]\d\)\|\(25[0-5]\)\)
换用notepad++,如下匹配,只有1个合法ip
正则:\b(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\b
终于将所有不合法的ip排除在外了。
好吧,这篇暂时写到这里了,还有点东西,再写一篇吧。
水平有限,如果有朋友发现错误,欢迎留言交流