Skip to content

正则表达式怎么用在业务里? ​

正则描述的是一类字符串。前端里用来校验格式、从文本里抽取片段、以及按模式替换。能用字符串方法说清的规则,不要上复杂正则。

原理 ​

字面量 /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 前要转义特殊字符,否则点号会匹配任意字符。

相关 ​