正则表达式:正则表达式是一种对字符串操做的逻辑表达式,用来对字符串进行筛选和匹配正则表达式
构成:正则表达式由元字符和普通字符构成,普通字符包含字母,数字,特殊符号,遇到普通字符直接写就能够匹配了,遇到转义字符须要\\去转义测试
重点在元字符,元字符才是正则表达式的灵魂网站
优缺点:编码
优势:灵活,功能性强,逻辑性强3d
缺点:难理解,不易上手blog
咱们通常能够用这个网站进行正则表达式的测试:http://tool.chinaz.com/regex/图片
下面来介绍正则表达式的灵魂----元字符ci
我只给出一些经常使用的元字符:
1.字符组字符串
用[]括起来的字符串叫作字符组,[]内的字符会被匹配到im
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 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾,前边要写结尾的字母
^ 匹配字符串的开头,后边要写开头的字符串
$ 匹配字符串的结尾,前边要写结尾的字符串
\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}\1\d{1,2}
还有不少,我就不写了,能够自行浏览