正则表达式
正则表达式
正则表达式是一种用于字符串搜索和操作的表达式,它由普通字符(如字母a到z)和特殊字符(称为"元字符")组成。
通过定义特定的模式,可以用于:
- 检查字符串是否符合某种格式(如邮箱验证)
- 查找符合特定规则的子串
- 提取字符串中的特定部分
- 替换文本中的内容
核心语法
字符匹配
| 表达式 | 说明 | 示例 |
|---|---|---|
| . | 匹配任意单个字符 | a.c 匹配 aac, abc, a与c中间可以是任意字符 |
| \d | 匹配数字(0-9) | \d\d 匹配 11,12 匹配两位的数字 |
| \D | 匹配非数字 | \D\D 匹配 ab,@A 匹配两位的非数字 |
| \w | 匹配字母、数字、下划线 | \w\w 匹配 ab, b_ |
| \W | 匹配非字母、数字、下划线 | \W\W 匹配 %&, !@ |
| \s | 匹配空白字符(空格、制表符等) | a\sb匹配 ‘a b’ |
| \S | 匹配非空白字符 | \S\S 匹配 ab, 12 |
量词(重复匹配)
量词控制前一项的数量
| 量词 | 说明 | 示例 |
|---|---|---|
| * | 0次或多次 | a*b 匹配 b, aab |
| + | 1次或多次 | a+b 匹配 ab, aaab 至少要出现一次 |
| ? | 0次或1次 | a?b 匹配 b, ab |
| 恰好n次 | a{2}b 匹配 aab |
|
| 至少n次 | a{2,}b 匹配 aab, aaaab |
|
| n到m次 | a{2,3}b 匹配 aab, aaab |
位置锚点
| 锚点 | 说明 | 示例 |
|---|---|---|
| ^ | 匹配字符串开始 | ^abc 匹配以abc开头的字符串 |
| \(|匹配字符串结束|`abc\)` 匹配以abc结尾的字符串 | ||
| \b | 匹配单词边界 | \babc\b 两个\b之间abc 匹配独立的abc单词 |
| \B | 匹配非单词边界 | \Babc\B 匹配abc但不作为独立单词 |
字符类
使用[]定义,匹配其中任意一个字符
基本字符类
[abc]:匹配a、b或c[a-z]:匹配a到z的任意小写字母[A-Z]:匹配A到Z的任意大写字母[0-9]:匹配0-9的数字 等同于\d
否定字符类
[^abc]:匹配不是a、b或c的任意字符[^a-z]:匹配不是小写字母的任意字符
注意:^在字符类[]中的行为与作为位置锚点时完全不同:
- 在字符类内部且是第一个字符时,表示否定
- 在字符类内部,但不在第一个字符时,表示字面量
^匹配符号本身 - 在字符类外部表示字符串/行的开始
字符类中的特殊字符
在字符类中,大多数元字符失去了特殊含义,变为字面值:
如.、*、+、?在字符类[]中都表示符号本身,不具有特殊含义
需要转义的字符:
-
^:如果出现在第一个字符位置表示否定,否则是字面值
[a^b]:匹配a、^或b- 如果要匹配单独的
^字符需要进行转义[\^]匹配^字符
-
-:用于表示范围,如a-z,如果要匹配字面值-:
- 放在字符类的开头或结尾:
[-a-z]、[a-z-]匹配 -或a-z的小写字母 - 或者进行转义:
[a\-z]匹配 a、- 或 z
-
]:表示字符类结束,要匹配字面值]需要:
- 放在字符类的开头:
[]abc]匹配]、a、b、c 不推荐 - 建议任何情况都进行转义 提高可读性
[abc\]]
-
\:匹配斜杠本身需要转义\\
分组与捕获
在正则表达式中,括号()有两个主要作用:分组和捕获
捕获分组(pattern)
- 将模式parttern作为一个分组
- 匹配的内容会被捕获并存储
- 可以通过反向引用\n或匹配结果数组访问
(ab)+ # 匹配一个或多个"ab"序列
如对于“abcababc”字符串
匹配结果为
["ab", "abab"]
捕获结果为
["ab", "abab"]
非捕获分组(?:pattern)
- 只分组不捕获
- 不会存储匹配内容
- 提高性能,减少内存使用
当需要匹配"abc"序列时,但仅需要用到"ab"不需要"c"时
(ab)(:?c)+ # 匹配一个或多个"abc"序列 但仅捕获ab
同样对于“abcababcabc”字符串
匹配结果为
["abc", "abcabc"]
捕获结果为
["ab", "abab"]
反向引用
反向引用允许你引用前面捕获的分组:
\1引用第一个捕获组\2引用第二个捕获组- 以此类推
(\d)\1 # 匹配相同的连续两个数字
如对于字符串"122344"
匹配结果为
["22", "44"]
分组中的量词
可以对整个分组应用量词
(ab){2,4} # 匹配"abab", "ababab"或"abababab"

浙公网安备 33010602011771号