外观
正则表达式怎么用在业务里?
正则描述的是一类字符串。前端里用来校验格式、从文本里抽取片段、以及按模式替换。能用字符串方法说清的规则,不要上复杂正则。
原理
字面量 /pattern/flags 或 new RegExp(source, flags)。常用标志:g 全局,i 忽略大小写,m 多行里 ^ $ 匹配每一行,u 按 Unicode 码点,s 让 . 匹配换行。
字符类 \d \w \s,量词 + * ? {m,n}。默认是贪婪的,加 ? 变成非贪婪。分组 () 会捕获,(?:) 只分组不捕获。
js
const phone = /^1\d{10}$/
"a1b2".match(/\d/g) // ["1", "2"]带 g 的正则有 lastIndex。同一个正则对象反复 test 或 exec,会从上一次的位置继续。校验函数里每次用新的正则,或在调用前把 lastIndex 设回 0。
追问
怎么避免灾难性回溯?
重叠的量词,例如 (a+)+ 配一个很长的失败输入,会指数级尝试。把规则写具体,或限制输入长度。邮箱、URL 优先用成熟规则,不要现场拼一个「能匹配一切」的表达式。
和字符串方法怎么配合?
replace 的第二个参数可以是函数,参数里能拿到每个捕获组。matchAll 返回全部匹配的迭代器,比循环 exec 少踩 lastIndex。
易错点
^$默认匹配整段的首尾。要匹配一行,加m。\d在 Unicode 模式下仍是 ASCII 数字,不包含所有语言的数字字符。- 把用户输入直接拼进
new RegExp前要转义特殊字符,否则点号会匹配任意字符。