正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
一.标准字符集合
能够与多种字符匹配的表达式,要区分大小写,大写代表取反
字符集合 | 描述 |
---|---|
\d | 表示任意一个数字 0-9 【\D 代表除了0-9的其他字符】 |
\w | 表示任意一个字母数字下划线 【\W 代表除了字母数字下划线的字符】 |
\s | 表示空格,制表符,换行符 【\S 代表除了制表符,换行符的其他字符】 |
. | 代表任意字符(除了换行符) |
注意:. 不能匹配换行符,如果需要匹配换行符在内的所有字符就要使用 [\s\S]
二.自定义字符集合
用方括号 [] 来自定义字符集合,能够匹配方括号中任意一个字符
示例
自定义集合 | 描述 |
---|---|
[ab5@] | 匹配a b 5 @ 中任意一个字符 |
[^abc] | 匹配a b c 之外的任意一个字符 |
[f-k] | 匹配 f-k 之间的任意一个字符 |
[^A-F0-3] | 匹配A-F 0-3 之外的任意一个字符 |
说明:
- 正则表达式的特殊符号被包含到中括号中,则失去特殊意义,除了^ - 符号之外
- 标准字符集合,除小数点外,如果被包含与中括号中,则自定义字符集合将包含该集合,比如:[\d.-+] 将匹配 数字 小数点 + -
三.量词(Quantifier)
修饰匹配次数的特殊符号
量词 | 描述 |
---|---|
{n} | 表达式重复 n 次 |
{m,n} | 表达式至少重复 m 次,至多重复 n 次 |
{m,} | 表达式至少重复 m 次 |
? | 匹配表达式 0 次或 1 次,等价于{0,1} |
+ | 表达式至少出现 1 次,相当于 {1,} |
* | 表达式不出现或出现任意次,相当于{0,} |
扩展
- 贪婪模式:匹配字符越多越好,正则表达式默认为贪婪模式
- 非贪婪模式:匹配字符越少越好,修饰匹配次数的特殊符号跟 ?
四.字符边界(零宽)
本组标记,匹配的不是字符而是位置,即符合某种条件的位置
标记 | 描述 |
---|---|
^ | 从字符串开始的地方匹配 |
$ | 从字符串结束的地方匹配 |
\b | 匹配一个单词边界 |
说明:\b 匹配前面的字符和后面的字符不全是\w
示例:
- java\b 会匹配字符串aaajava种的java,不会匹配aaajavaaaa中的Java
- \bpython 会匹配字符串pythonaaaa中的python,不会匹配aaapythonaaa
五.常用的匹配模式
匹配模式 | 描述 |
---|---|
IGNORECASE 忽略大小写模式 | ①匹配时忽略大小写 ②默认情况下,正则表达式是要区分大小写的 |
SINGLELINE 单行模式 | ①整个文本看成一个字符串,只有一个开头,一个结尾 ②使小数点 . 可以匹配包含换行符 \n 在内的任意字符 |
MULTILINE 多行模式 | ①每行都是一个字符串,都有开头和结尾②在指定了 MULTILINE 之后,如果需要仅匹配字符串开始和结束的位置【相当于看成单行匹配】,可以在匹配字符前使用 \A 和 在匹配字符后使用 \Z |
六.选择符和分组
- | 分支结构: 左右两边表达式之间是 或 关系,匹配左边或者右边
- () 捕获组:
Ⅰ. 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
Ⅱ. 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
Ⅲ. 每一对括号都会分配一个编号,使用 () 的捕获根据左括号的顺序从1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本
Ⅳ.捕获组会根据编号存储到内存中,如果不想存储到内存中,可以使用非捕获组 - (?:Expression) 非捕获组: 一些表达式中,不得不使用(),但是又不需要保存()中的表达式匹配内容,这时可以使用非捕获组来抵销使用 () 的副作用
说明: 反向引用(\nn),通过反向引用,可以对分组已捕获的字符串进行引用
例子1:
xasdf xxyxxy0101 pythonpython
匹配 xxyxxy0101 正则表达式 ([a-z]{3,4})\1([0-9]{2,3})\2
例子2:
匹配python Python 正则表达式 (?:p|P)ython
六.位置搜索(零宽断言)
- 只进行子表达式的匹配,匹配内容不计入最终的匹配结果,这样的情况叫做零宽度
- 这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定条件,但不匹配前后字符。这叫做对位置的匹配,即零宽度
- 正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的;如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的。占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果中而言的
语法 | 描述 |
---|---|
(?<=exp) | 前向界定,自身出现的位置的前面能匹配表达式exp |
(?=exp) | 后向界定,自身出现的位置的后面能匹配表达式exp |
(?!<exp) | 自身出现的位置的前面不能匹配表达式exp |
(?!exp) | 自身出现的位置的后面不能匹配表达式exp |
例子1:
匹配以ing结尾的单词,不包括ing
xasdf xxyxxy0101 u going eating
匹配 go eat 正则表达式 \w+(?=ing)
例子2:
匹配不是以ing结尾的单词
python going 321ing
匹配 32 正则表达式 \d+(?!ing)
例子3:
匹配Hadoop单词
javaHadooppython
正则表达式 (?<=java).*(?=python)