正则表达式
最近写小工具多次用到正则表达式,由于没有系统地学习过,每次百度现学现卖都挺费劲。下面好好地梳理一下正则表达式的知识。
首先,什么是正则表达式呢?它是一种特殊的字符串模式,用于匹配一组字符串。说白了就是用正则表达式制定一个规则,按照规则去寻找符合要求的字符串。
1. 正则元字符
元字符是构造正则表达式的一种基本元素,我们来记几个常用的元字符。
元字符 | 说明 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
. | 匹配除换行符外的任意字符 |
\w | 匹配数字、字母、下划线、汉字 |
\d | 匹配任意的数字 |
\s | 匹配任意的空白符 |
\b | 匹配字符串的开始或结束 |
[abc] | 匹配方括号中的字符组 |
2. 几种反义
写法很简单,改成大写就行了,意思与原来相反。
反义字符 | 说明 |
\W |
匹配除数字、字母、下划线、汉字以外的字符,即特殊字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配不是数字的字符 |
\B | 匹配不是开始和结束的位置 |
[^abc] | 匹配除了abc之外的字符 |
3. 量词
* (贪婪):重复0次或更多
+(占用):重复1次或更多
?(懒惰):匹配得越少越好,0次或1次
{n}:重复N次,比如"a{3}",即取"aaa"
{n, m}:重复n-m次,比如a{3, 4},即取"aaa"或"aaaa"
{n,}:重复n次或更多次,无上限
4. 懒惰限定符
*? 重复任意次,但尽可能少重复
如 "acbacb" 正则 "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就是"acb"
+? 重复1次或更多次,但尽可能少重复
与上面一样,只是至少要重复1次
?? 重复0次或1次,但尽可能少重复
如 "aaacb" 正则 "a.??b" 只会取到最后的三个字符"acb"
{n,m}? 重复n到m次,但尽可能少重复
如 "aaaaaaaa" 正则 "a{0,m}" 因为最少是0次所以取到结果为空
{n,}? 重复n次以上,但尽可能少重复
如 "aaaaaaa" 正则 "a{1,}" 最少是1次所以取到结果为 "a"