目录
一、限定符
1、?
代表前面一个的一个字符需要出现0或1次,即可有可无。
例:
used?:匹配use或used
2、*
代表前面一个字符出现0或多次
例:
ab*c:匹配ac/abc/abbbbbbbc
3、+
代表前面一个字符出现一次以上
例:
ab+c:匹配abc/abbbbbc
4、{}
精确匹配前面一个字符出现的次数
例:
ab{6}c:匹配abbbbbbc
ab{2,6}c:匹配b出现了2-6次的
ab{2,}:匹配b出现了2次以上的
*类似于{0,};+类似于{1,}。
5、()
用于多个字符的匹配
例:
(abc){3}:匹配abcabcabc
6、|
或运算符
例:
a (cat|dog):匹配a cat或a dog
7、[]
限定只能匹配【】内的限定字符
例:
[abc]*:匹配所有由a、b、c组成的字符
[0-9]:匹配所有的数字字符
[a-z]:匹配所有的小写字符
[A-Z]:匹配所有的大写字符
[a-zA-Z0-9]:匹配所有的英文和数字
[Pp]ython:匹配Python或python
二、元字符
语法 | 说明 |
. | 匹配行首 |
^ | 匹配行尾 |
$ | 匹配任意字符(不包括Tab和换行符) |
\d+ | 数字字符,类似于[0-9] |
\w+ | 单词字符,类似于[a-zA-z] |
\s+ | 空白字符 |
\b | 标识字符的边界 |
\D+ | 非数字字符,类似于[^0-9] |
\S+ | 非空白字符 |
\W+ | 非单词字符,类似于[^a-zA-Z] |
/B | 匹配不是单词开头或结束的位置 |
三、懒惰与贪婪匹配
贪婪匹配:正则表达式默认匹配尽可能多的字符。
懒惰匹配:用?(跟在+或*后面)将贪婪匹配切换为懒惰匹配,匹配尽可能少的字符。
代码/语法 | 说明 |
---|---|
*? | 重复任意次,但优先匹配少重复的字符串 |
+? | 重复1次或更多次,但优先匹配重复1次的字符串 |
?? | 重复0次或1次,但优先匹配0次的字符串 |
例:
a.*b:匹配最长的以a开始,以b结束的字符串。
//如果我们需要匹配的是ab,就需要用到懒惰匹配。
a.*?b:匹配最短的以a开始,以b结束的字符串
\d{8,9}?:匹配8个数字
四、分组
用于将多个字符重复,主要通过使用小括号()来进行分组
1、捕获式分组
捕获括号内的内容
例:
(\d{4})[\-\s]?(\d{4})[\-\s]?(\d{2}):可以匹配类似2911-1415-34的字符串,并提取出2911 1415 34
2、非捕获式分组
用(?:表达式)来实现非捕获组,不捕获括号里的内容。
五、回溯引用
回溯引用是指模式的后半部分引用在前半部分中定义的子表达式。
例1:
有如下两个字符串:
123<font>提示</bar>abcd
123<font>提示</font>abcd
我们需要提取第二种,就可以用这样的正则表达式:
<(\w+)>(.*?)</\1>
这里的\1指的就是引用第一个括号里的子表达式。
例2:
编写代码匹配符合abba这种关系的单词,正则表达式如下:
(\w)(\w)\2\1
\2表示引用第二个括号的子表达式,\1表示引用第一个括号的子表达式。
六、环视
1、正向先行断言
从左往右看表达式所在右侧一定有表达式,语法:(?=表达式)
例:
匹配喜欢后面一定有你的字符串:喜欢(?=你)
2、反向先行断言
从左往右看表达式所在右侧一定没有表达式,语法:(?!表达式)
例:
排除QQ邮箱:(?!qq.com)
3、正向后行断言
从右往左看表达式所在左边一定有表达式,语法:(?<=表达式)
例:
喜欢前面一定有我,后面一定有你的字符串:(?<=我)喜欢(?=你)
所有的赵姓同学:(?<=赵)\S{2,4}
4、反向后行断言
从右往左看表达式所在右侧一定没有表达式,语法:(?<!表达式)
例:
爱国前一定没有不的字符串:(?<!不)爱国