正则表达式:正则表达式是一种对字符串操作的逻辑表达式,用来对字符串进行筛选和匹配
构成:正则表达式由元字符和普通字符构成,普通字符包含字母,数字,特殊符号,遇到普通字符直接写就可以匹配了,遇到转义字符需要\去转义
重点在元字符,元字符才是正则表达式的灵魂
优缺点:
优点:灵活,功能性强,逻辑性强
缺点:难理解,不易上手
我们一般可以用这个网站进行正则表达式的测试:http://tool.chinaz.com/regex/
下面来介绍正则表达式的灵魂----元字符
我只给出一些常用的元字符:
1.字符组
用[]括起来的字符串叫做字符组,[]内的字符会被匹配到
eg:正则表达式是[abc],那么字符串中的a,b,c都会被匹配到
如果字符组里的内容过多,还可以用-表示范围的意思,eg:[a-z]就是匹配a到z之间的所有小写字母(包括a,z) [A-Za-z]匹配的是A-Z与a-z之间的所有字母(包括两端)
ps:为什么是A-Z写前面呢? 字符组里的内容的顺序是按照ascii码的顺序,在ascii码表里A-Z排在a-z的前边,所以他就排前边喽,顺序千万不能反,否则匹配不出来
2.简单元字符(常用)
. 匹配除换行符以外的任意字符
w 匹配字母或数字或下划线
s 匹配任意空白符
d 匹配数字
匹配一个换行符
匹配一个制表符
匹配一个单词的结尾,前边要写结尾的字母
^ 匹配字符串的开头,后边要写开头的字符串
$ 匹配字符串的结尾,前边要写结尾的字符串
W 匹配非字母或数字或下划线
D 匹配非数字
S 匹配非空白符
a|b 匹配字符串a或字符串b
() 匹配括号内的表达式, ps:()的优先级高,匹配时先看()中的内容
[] 字符组(上边已经说过了)
[^] 匹配除了字符串中的字符的所有其他字符
3.量词
使用量词可以一次性的匹配到很多个字符
* 重复0次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n-m次
4.惰性匹配和贪婪匹配
惰性和贪婪顾名思义,一个表示尽可能的少,一个表示尽可能的多
量词中的 * + {} 都属于贪婪匹配,就是在满足匹配时,尽可能长的匹配字符串
?则属于惰性匹配,就是在满足匹配时,尽可能少的匹配字符串
理论的东西差不多说完了,我们实践一下
我们看下这个,正则表达式是小明.*,首先只要是小明就能匹配到,然后.,就是除了换行符都能匹配到,然后*就是贪婪匹配,尽可能的多的匹配
如果加一个?呢,应该匹配小明吧,因为?属于惰性匹配,匹配的小明之后,尽可能少的匹配,也就是不匹配字符了,我们来验证一下
与我们的猜想符合,继续往下看
简单分析一下,首先以<开头才能进行匹配,然后.*表示只要是换行符我都能匹配到,然后还得是>结尾,字符串满足这些规则,很自然就匹配上了
下边着重说一下贪婪匹配和惰性匹配
第一张图片是惰性匹配,第二章图片是贪婪匹配,我们可以很清楚的看到差别,
在第一张图中,惰性这个词体现的淋漓尽致,因为有.所以他要匹配除了换行符之外的字符,然后又一a为结尾,所以我尽可能的少匹配,只要匹配a前边一个字符就好了,一匹配a就返回匹配结果
在第二种图中,贪婪这个词也体现的淋漓尽致,首先还是先匹配除换行符以外的其他字符,然后以a为结尾,但是碰到第一个a我不管,继续往下匹配,知道碰到最后一个a,我才返回匹配结果,尽可能的是匹配到的字符串长
下边我给出几个常用的正则表达式(摘自http://tool.chinaz.com/regex/),我们可以自己解读一下,当然如果有能力的话,自己写正则也不错
E-mail地址:w[-w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}
身份证号:d{17}[d|x]|d{15}
手机号(国内):0?(13|14|15|17|18|19)[0-9]{9}
邮政编码:d{6}
IP地址:(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d).(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d).(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d).(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d)
格式日期:d{4}(-|/|.)d{1,2}1d{1,2}
还有很多,我就不写了,可以自行浏览