认识正则表达式
定义:正正则表达式又称为模式匹配,描述了一种字符串匹配的模式。
用途:
1)检查一个串中是否含有符合某个规则的子串,并且可以得到这个串
2)根据匹配规则对字符串进行灵活的替换操作
不同语言之间的正则表达式的写法由于一些语言的特殊符号的使用会略有不同,但实则大同小异。
正则表达式的匹配过程
输入行(字符串) Regular expression interpretation.
模式 ation
Regular
ation
-
在这个过程中,输入行的第一个字符R与模式的第一个字符不匹配,匹配失败,接着用下一个字符e与模式的第一个字符相比较。
Regualr
ation -
直到输入行中的字符a满足模式中的第一个字符a,然后进行第二个字符的比较。
Regualr
ation -
模式中的第二个字符与输入行的下一个字符不匹配
Regualr
ation -
返回模式的第一个字符与输入行中的下一个字符相比较
interpretation.
ation -
在输入行中遇到与模式中的第一个字符相匹配的字符
interpretation.
ation -
仍然相匹配
interpretation.
ation -
直到最后一个字符n都是匹配的,因此这个输入行匹配这个模式
正则表达式的规则(基础)
普通字符串
字母、数字、下划线、汉字、包含一些没有特殊定义的标点符号(!,”: ;),都是普通字符,普通字符在匹配一个字符串的时候,匹配与之相同的一个字符,比如刚才介绍的字面值的匹配模式。
能与多种字符匹配的表达式
表达式 | 用途 |
---|---|
/d | 匹配任意一个0~9中的数字 |
/w | 匹配任意一个大小写字母或下划线 A~Z a~z _ |
/s | 匹配 空格,制表符,换页符等空白字符的其中任意一个 |
/D | 匹配所有的非数字非数字字符中的一个 |
/W | 匹配所有的字母,数字,下划线以外的字符中的一个 |
/S | 匹配所有非空白字符中的一个 |
例1:字符串 abc123
表达式 /d/d 可以匹配成功,匹配到的子字符串是12
表达式 /w 同样可以匹配成功,匹配到的是a
注意:正则表达都是单个字符之间的匹配
元字符
1. .
用来匹配除换行符以外的任意单个字符
例子: 表达式 : “abc.567可以匹配 abc1567 abcd567 abc,567
2. *
匹配任意一个(包括零个)个在他前面的字符(包括由正则表达式制定的字符)
例如:abc*567 可以匹配的字符串有 abc567 ab567 abcc567
3. ^
当作为正则表达式的第一个字符时,代表匹配字符串的开始。
举例:^abc 表示从a开始进行匹配
4. $
当作为正则表达式的最后一个字符时,表示匹配行的结尾
举例:abc$ 表示正则表达式的结尾
特殊用法:
^$ 匹配空行
^.*$ 匹配整行
易混点: .* 与shell 中的含义是截然不同的,这里的*是用来修饰.的,代表.可以出现0次或多次。
5. +
匹配前面的表达式的一次或多次出现
举例: abc+ 可以匹配 abc abcc abccc
6. ?
匹配前面的正则表达式的0次或1次的出现
举例:abc? 可以匹配 abc或ab
7. \
转义字符,用来转义随后的特殊字符 比如说向表示一个 . 的话,就需要使用.来进行表示它真正的含义。
8. {n}
表达式出现n次,比如 /w{2} 相当于 /w/w a{5} 相当于aaaaa
9. {m,n}
表达式至少重复m次,最多重复n次
比如:ba{1,3} 可以匹配 baa baa baaa
10. {m, }
表达式至少重复m次
比如: /w/d{2,} 可以匹配 a12 a123 b1234 …
11. []
使用[ ]方括号括起来的,匹配方括号中的字符类中的任意一个
例如 [Ww]hat
这个正则表达式可以匹配 what 或者 What 或者what
[^Ww]hat
如果方括号内的第一个字符是^ ,代表匹配非括号内的任意一个字符
可以匹配 Ahat ahat bhat ……
12. –
连字符,用于指定一个字符范围,所有的大写字母范围可以指定为【A-Z】
数字范围可以指定为【0-9】
但是将-放在第一位或者是最后一位,则不具有这种效果
13. |
左右两边的表达式之间“或”关系,匹配左边或者右边
Tom|Jack 在匹配字符串的时候,匹配Tom或Jack
14. ()
对正则表达式分组,表示一个整体,并设置优先级
1) 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
2) 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独取到。
例如: (go/s*)+ 可以匹配 “ go go go”
正则表达式的高级规则
匹配次数中的贪婪与非贪婪
在使用修饰匹配次数的特殊符号({m,n} {m,} ? * +)时,这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。
比如字符串 “dxxxdxxxd”
表达式 (d)(/w+) “/w+”将会匹配第一个字符d之后的所有的字符
表达式(d)(/w+)(d) “/w+”将只会匹配”xxxdxxx” 虽然也可以匹配完全,但是为了使整个表达式匹配成功,会让出最后一个d,可以看出,/w+ 在进行匹配的时候总是尽可能多的匹配符合它规则的字符,同理,{m,n} * 也是如此这就是贪婪模式。
非贪婪模式:
语法:在匹配次数的特殊符号之后再加上一个?,可以使匹配次数尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的不匹配。
还是上面的例子:
(d)(/w+?) 匹配到的将会是 dx /w+? 只会匹配一个字符
(d)(/w+?)d 匹配到的将会是 dxxxd
反向引用
表达式在匹配时,表达式引擎会将小括号() 包含的表达式所匹配到的字符串记录下来。在回去匹配结果的时候小括号包含的表达式所匹配到的字符串可以单独获取,引用的方法是/1 将匹配第一对括号内匹配到的字符串,/2将匹配第二对括号内匹配到的字符串,括号的顺序,通过左小括号的位置来指定。
举例1:(“|’)(.*?)(/1) 在匹配 ’Hello’,”World” 的时候是匹配成功的。 第一次匹配到的结果将是‘Hello’ 继续匹配到的将是“World”
举例2:(/w)/1{4,} 在匹配”aa bbbb abcdefg ccccc 111121111 99999999” 时将会匹配到 ccccc 和 99999999 代表的意思是 /w的字符至少重复5次,但是它和 /w{5,}是不一样的。
预搜索,不匹配;反向预搜索,不匹配
和“^” “$” 此类符号相似,本身不匹配任何的字符。
正向预搜索语法 (?=xxxxx) 或 (?!xxxxx)
(?=xxxxx):表示所在的右侧,必须能匹配上xxxxx这部分表达式
举例:表达式 Windows (?=NT|XP) 在匹配字符串“Windows 98, Windows NT, Windows 2000”时只能匹配“Windows NT”中的Windows。
(?!xxxxx) 表示在右侧不能匹配xxxxx这部分表达式
举例:表达式“do(?!/w)”在匹配字符串 “done,do,dog”时,只能匹配到第二个do
反向预搜索 (?<=xxxxx) 或 (?<!xxxxx)
与正向与搜索类似,反向预搜索要求的条件是,左侧能够匹配xxxxx或者是不能匹配xxxxx
如何正确编写正则表达式
- 知道要匹配的内容以及它如何出现在文本中
- 编写一个模式来描述要匹配的内容
- 测试模式来查看它匹配的内容
在测试的过程中一般会遇到以下几种情况:
1) 是我想要匹配的行
2) 不是我想匹配的行
3) 是想匹配但没匹配到的行
4) 是不相匹配但是匹配到的行
。
所以就是讲不希望得到的去除,将希望的获取到。