正则表达式(overall)

令自己想爱但深爱不上的正则表达式~

20151122235748_nvfc5.thumb.700_0

阅读网站:http://c.biancheng.net/cpp/html/1402.html

为什么使用正则表达式?

①防止SQL注入:尤其对于网站,安全是至关重要的,写好正则表达式,能够验证输入信息,保证输入数据的合法性,不至于不法人士侵入数据库破坏网站;

②采集:从互联网上按照某种规则搜索想要的数据,对于分析复杂的HTML标签,正则表达式是一件利器;

③验证数据:无论对于软件还是网站,用户输入的数据都需要验证后再提交,以得到安全和想要的数据。

1.\b:

正则表达式规定的一个特殊代码(某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置

精确地查找hi这个单词的话,我们应该使用\bhi\b。

2..

元字符,匹配除了换行符以外的任意字符。

3.*

元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配(重复零次或更多次)。

所以当.*连在一起就意味着任意数量的不包含换行的字符。

4.\d

元字符,匹配一位数字(0,或1,或2,或……)。

5.-

不是元字符,只匹配它本身——连字符(或者减号,或者中横线,或者随你怎么称呼它)。

6.\s

匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。

7.\w

匹配字母或数字或下划线或汉字等。

8.^

匹配字符串的开始

9.$

匹配字符串的结束

10.+

重复一次或更多次

11.?

重复零次或一次

12.{n}

重复n次

13.{n,}

重复n次或更多次

14.{n,m}


重复n到m次

分枝条件

正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。

反义(大写):

QQ截图20170824134204

零宽断言:

用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言);

(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。

(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})*\b,用它对1234567890进行查找时结果是234567890。

(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)

懒惰限定符:

正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。考虑这个表达式:

a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。

这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

懒惰限定符

更多的……

正则表达式的其他规则_C语言中文网

更多例子:

1.要求填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$;

2. 匹配刚好6个字母/数字的单词:\b\w{6}\b

3.\ba\w*\b匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b);

4.0\d{2}-\d{8}|0\d{3}-\d{7}匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445);

5.((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)IP地址;

6.(?<![a-z])\d{7}匹配前面不是小写字母的七位数字;

7.\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;

8.\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词;

9.(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容——

(<?(\w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),

然后是.*(任意的字符串),最后是一个后缀(?=<\/\1>)。

注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身);

10.总览表:

正则表达式所有元字符及其使用方法一览表_C语言中文网

写在最后的:

果然,正则表达式会是自己一直的“痛”,不过终再努力一点,加油~

timg

posted @ 2017-08-24 14:41  郑叶叶  阅读(617)  评论(2编辑  收藏  举报