先用测试器定位
把正则和文本粘到 正则表达式测试器,看高亮到底匹配了什么——绝大多数问题一眼就能看出是”没匹配”还是”匹配过头”。
问题 1:一个都不匹配
- 该转义没转义:
.*+?([\等是元字符。要匹配字面量小数点得写\.,否则.会匹配任意字符导致逻辑不符。 - 大小写不符:默认区分大小写。匹配
Hello/HELLO都要命中就加i标志。 - 锚点太严:用了
^...$但文本首尾有空格或换行,导致整串不匹配。先去掉锚点试,或允许空白。
问题 2:匹配过多 / 过头
- 贪婪量词:
.*会尽量多吃。改非贪婪.*?,或用取反字符类精确限定,如提取引号内容用"([^"]*)"而非"(.*)"。 - 忘了单词边界:想匹配独立单词 cat,用
\bcat\b,否则会命中 category 里的 cat。
问题 3:多行文本不符合预期
^$默认匹配整个字符串的首尾。要让它们匹配每一行的首尾,加m(多行)标志。.默认不匹配换行。要让它跨行匹配,加s(dotAll)标志。
问题 4:中文 / Unicode 匹配异常
\w默认不含中文。匹配中文用范围[一-龥],或对某些属性用u标志配合\p{...}(视语言支持而定)。
问题 5:正则运行很慢甚至卡死(ReDoS)
- 形如
(a+)+、(.*)*的嵌套量词在特定输入下会”灾难性回溯”,耗时爆炸。 - 解决:避免嵌套量词、用更具体的字符类、必要时加锚点。本站 测试器 在独立线程运行并设超时保护,遇到这种情况会提示你而不会卡死页面。