微博项目做到了超链接解析部分,听说要用到正则表达式,于是苦逼地上网查、然后苦逼地看到了这些让人苦逼的东西。算,废话不说了。
如果是完全的初学者,有一个网站非常推荐:
jb51.net/tools/zhengze.html
我就是看着这个学习的,现在在这里mark下我需要的东东。
我所理解的正则表达式的应用:正则表达式就是用来进行文本匹配的工具,例如:做网页前端的时候有时需要处理账号密码的合法性(打个比方,账号必须以字母开头,后面是n位数字;或者密码必须是长度为6到12的纯数字等)。在这些地方正则表达式都能起到至关重要的作用。但是正则表达式不提供任何数学功能,所以在做比如上述例子或者做例如匹配ip地址等时只能自己写一些略长的表达式来做到。
正则表达式的部分元字符:
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
例如:上述密码的判定可以用^\d{6,12}$,其中\为转义字符,同各编程语言;{n}表示匹配(满足条件的文本)重复n次,不多不少正好n次,而{m,n}(中间没有空格)是指匹配满足条件的文本不小于m次且不大于n次。
正则表达式中的限定符:
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n, m} 重复n到m次
例如:windows\d+代表匹配windows以及后面至少一个数字
自定义集合:“[]”
可以利用[]来定义要查找的字符集合。例如[13579](只查找1or3or5or7or9)、[abc](只找a or b or c)等。
一个更复杂的例子:\(?0\d{2}[- )]?\d{8} 直观上看,一个0加上两个数,后面又有八个数,可以猜测一下这是在匹配电话号码。实际上,让我们逐个字符分析:首先是\(?,一个转义字符加上一个(,表示(本身,后面又一个?,表示(出现一次或0次。然后一个0,然后两个数字,然后是自定义的集合,或者“-”或者“ ”或者")",三者之间的任意一个,然后一个问号表示出现一次或两次。最后是八位数字。大家把这些连起来试试:(010)12345678、010 12345678、01012345678、010-12345678等等都被匹配上了。当然了,大家可能也会注意到(010 12345678、010)12345678这样的也被匹配上了。这不是我们想要的,所以我们需要用到正则表达式的分枝语句。
正则表达式的分枝语句:
其实,所谓分枝语句就类似与编程语言中的||,无非就是变成了|,把它理解成或,就是指两者(或多者)之间满足任意一个条件即可匹配。直接上例子:
将上述电话号码更改一下:\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8} 这个式子表示匹配的电话号码可以加空格也可以不加。需要注意的是,|跟||一样,是短路式的判定,也就是说,当条件一满足时条件二被忽略,所以应该把大条件放到后面(与try{}catch{}的抓异常方式一样)。
正则表达式的其他知识点:
由于我只是简单的用到正则表达式来处理超链接问题,所以剩下不少只是简单地在这里写一下好了。
1、正则表达式的分组:多个不同字符重复的匹配。用法:(#表达式#)
2、反义:
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) | |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(?<!exp) | 匹配前面不是exp的位置 | |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
4、零宽断言与负向零宽断言
(?=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。
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
同理,我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
以上即为正则表达式的大部分内容,希望以后不会在遇到它