正则表达式
一、定义
正则表达式(Regular Expression,简称 RegExp)是一种用来描述字符串匹配模式的语法规则。它可以用来:
- 检查字符串是否符合某种模式(如邮箱格式)
- 在字符串中查找匹配的内容
- 替换匹配到的字符串
二、创建方式
1. 字面量方式:
const regex = /abc/;
2. 构造函数方式:
const regex = new RegExp("abc");
区别:构造函数方式更适合动态构建正则表达式。
三、常用元字符(Metacharacters)
元字符 | 含义 |
---|---|
. | 匹配任意单个字符(除了换行符) |
\d | 匹配任意数字,等价于 [0-9] |
\D | 匹配非数字字符 |
\w | 匹配字母、数字、下划线 |
\W | 匹配非字母数字下划线 |
\s | 匹配空白字符(空格、制表符等) |
\S | 匹配非空白字符 |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
[] | 匹配方括号中的任意一个字符 |
[^] | 不匹配方括号中的字符 |
| | 或运算符,表示"或者" |
四、量词(Quantifiers)
符号 | 含义 |
---|---|
* | 匹配前一项 0 次或多次 |
+ | 匹配前一项 1 次或多次 |
? | 匹配前一项 0 次或 1 次 |
{n} | 匹配前一项恰好 n 次 |
{n,} | 匹配至少 n 次 |
{n,m} | 匹配 n 到 m 次 |
五、正则表达式的方法
1. RegExp 实例的方法:
test(str); // 返回 true 或 false
exec(str); // 返回匹配结果或 null
示例:
const regex = /\d+/;
regex.test("abc123"); // true
regex.exec("abc123"); // ["123"]
2. String 的正则方法:
str.match(regex);
str.replace(regex, newSubStr);
str.search(regex);
str.split(regex);
六、分组与引用
1. 分组 ()
:
const regex = /(ab)+/;
regex.test("abab"); // true
2. 捕获组引用:
const regex = /(\w+)\s\1/;
console.log(regex.test("hello hello")); // true
七、常用的正则表达式示例
1. 验证手机号(中国大陆)
/^1[3-9]\d{9}$/;
2. 验证邮箱
/^[\w.-]+@[\w.-]+\.\w+$/;
3. 验证身份证号(18 位)
/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/;
八、修饰符(Flags)
修饰符 | 含义 |
---|---|
g | 全局匹配 |
i | 忽略大小写 |
m | 多行匹配(影响 ^ 和 $ ) |
u | 支持 Unicode |
s | 允许 . 匹配换行符(ES2018) |
示例:
const regex = /abc/gi;
九、懒惰匹配 vs 贪婪匹配
- 贪婪匹配:尽可能多地匹配(默认)
- 懒惰匹配:尽可能少地匹配,需要加
?
const str = "<div>content</div>";
const greedy = /<.*>/; // 匹配 "<div>content</div>"
const lazy = /<.*?>/; // 匹配 "<div>"
十、常见陷阱与建议
- 正则中要转义的字符很多,如:
\. \+ \* \? \^ \$ \[ \] \( \) \{ \} \| \\
- 写复杂正则时建议分段调试,或使用正则调试网站(如 regex101.com)
- 有时候用正则不如直接写字符串处理代码更清晰