正则表达式是个非常好的工具,它的作用主要是用简单的有规则的表达式来检索和匹配一段字符串。
所以正则表达式的作用大致有两种:
1、匹配
2、检索
为了更好的测试正则表达式的规律我们可以采用正则表达式工具。RegEx Buddy。
一、正则表达式基础知识
1、元字符的概念和元字符的反义
(1) 点(.)
表示匹配除了换行符意外的任意单个字符。
(2)\w
表示匹配数字,字母,下划线,汉字等单个字符
如上,空格和标点符号和斜杠都没有匹配上。其余都匹配上了
(3)\s
匹配任意空白单个符
如上,所有空格被匹配上了。其余没有
(4)\d
匹配单个数字
(5)\b
匹配单词的开始或结束
\bgood
(6)\W
与\w是反义,即\W匹配的是任意不是字母,数字,下划线或汉字的单个字符
(7)\S
与\s是反义,即\S匹配任意不是空白的单个字符,换行符也算是空白
(8)\D
与\d是反义,即\D匹配的是任意不是数字的单个字符
(9)\B
与\b是反义,即\B匹配的是任意不是单词开头或结束的字符
\Bgood
上述结果刚好和\b相反
(10)[^x]
匹配除了x意外的任意单个字符
[^2]
上述结果除了2外其他全部匹配上了。
(11)[^good]
匹配除了good字母外外的任意单个字符
(12)^和$
表示字符串的开头或者字符串的结尾。
例如:
^a?ld&
表示的是匹配一个字符串其开头有或者没有a字符,但后面肯定紧跟着ld并结束的字符串。
所以ald、old、cld、eld、都可匹配
adalde不可匹配,因为ald在中间,前面不是开始,后面也不是结束
2、转义匹配
以‘.’符号为例,上述我们提及到了‘.’匹配的是任意不为空的字符。但是如果我们就是想要匹配‘.’怎么办?
解决办法就是加上.即可。
3、实例
1、
I am a Apple,the old is 16.
ald
bld
cld
eld
fld
gld
ld
问:找出上述字符串中的所有包含ld的单词
答:^.?ld$
解析:
‘.’表示匹配所有不为空的单个字符
‘?’与‘.’搭配表示有或者没有即0或1都可的意思
ld表示匹配中含有这两个字母
^和$表示匹配的开始和结束
注意:第一句中的old不会匹配,因为它并不是开始位置,不符合^的约束
二、正则表达式中几种重复模式
1、*
指的是重复零次或更多次
2、+
指的是重复一次货更多次
3、?
指的是重复一次或零次
4、{n}
指的是重复n次
5、{n,}
指的是重复n次或更多次
6、{n,m}
指的是重复n到m次,例如{2,4}即2个到4个均可以。
三、正则表达式中分支条件
如果匹配模式包含多种,只要满足其中一种即可的话。就将多种表达式中间用|符号隔开,即使或的意思。
如下:
0\d{2}-\d{8}|0\d{3}-\d{8}
以上两种表达式只要满足其中一种即可。值得注意的是,会存在短路现象。
四、正则表达式字符类
首先提个概念:
[]的作用是表示一个范围。
例如:
[aeiou]表示aeiou都可以
[0-4]表示01234这几个字符
常用字符类说明:
1、[0-9]\d 表示单个数字字符
2、[a-z0-9A-Z]\w 表示数字,字母汉字等
3、[aeiou] 表示aeiou都可以
又如下:
(?0\d{2}[)-]?\d{8}
其中(代表‘(’这个字符,前面的\是转义的意思
固上面的正则表达式的意思为:
匹配一个字符串,其中开头可能有(也可能没有,接着后面固定为0开头的共三位数字,接着有或者没有)或者-,最后又8个数字。
它的目的就是匹配前三个数字带括号或者中间带-的号码。
五、正则表达式的分组概念&贪婪与懒惰概念
1、分组
(1)将子表达式做成子集
(2)使用()进行分组
(3)方便对match的字符串进行划分
(4)分组的命名:(?exp)
(5)(?:exp)
(6)(\d{1,3}.){3}\d{1,3} IP地址的匹配
2、贪婪和懒惰
(1)*? 重复任意次,但是尽可能少
(2)+?重复1次或更多次,但尽可能少
(3)??重复0次货
(1)贪婪 (尽可能的多)
a.*b表示匹配第一个字符为a,最后一个为b中间有0个或很多个任意非空字符。
所以aabab的结果为aabab
(2)懒惰 (尽可能的少)
a.*?b表示匹配第一个字符为a,最后一个字符为b,中间可能有多个任意非空字符可能没有。其中?是与*匹配的,这样的结果就是要么只有一个任意非空字符,要么有多个非空字符。
所以aabab的结果为aab,因为aab满足中间有一个字符。按照就
六、处理选项
1、IgnoreCase
匹配时不区分大小写
2、Multiline
更改^和$的含义,使他们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。
通常来说^和$有两个可选择的含义,一个是一个连串的单词的首和尾,
一个是一整行的首和尾,通过Multiline可以改变他们的含义,使之面向的是一整行的首和尾。
3、Singleline
更改.的含义,使它与每一个字符匹配(包括换行符\n)
4、IgnorePatternWhitespace
忽略表达式中的非转义空白并启用由#标记的注释
5、ExplicitCapture
仅补货已被显示命名的组
七、负向0宽断言
例如:查找这样一个单词–它里面出现了字母q但是后面不能跟u
表达式1:
\b\w*[^u]\w*\b