
_ 不是通配符,它就匹配下划线字符本身很多人误以为 _ 在正则里像 * 或 ? 那样代表“任意字符”,其实不是。_ 是普通字符,只匹配字面量的下划线。真正匹配“任意单个字符”的是 .(英文点号),但要注意它默认不匹配换行符(n)。
. 匹配任意字符时的常见陷阱用 . 本意是“任意字符”,但实际行为受模式修饰符和上下文影响:
/.../ 字面量中,. 默认不匹配 n、r、u2028、u2029Python 的 re.match() 或 re.search() 中,需显式传入 re.DOTALL 才让 . 匹配换行符如果想“安全地匹配任意字符(含换行)”,更可靠的方式是用 [sS](匹配所有空白与非空白)或 [dD]、[wW]import retext = "line1nline2"re.search(r"a.b", text)# None —— . 不跨行re.search(r"a.b", text, re.DOTALL)# 匹配成功re.search(r"a[sS]b", text) # 总是成功,无需 flag
_ 需要转义吗?什么时候必须加 __ 在绝大多数正则引擎中**不需要转义**——它不在元字符列表里(元字符如 . ^ $ * + ? { } [ ] | ( ))。但在两种情况下你可能看到 _:
_ 是单字符通配符),导致思维迁移错误极少数正则方言(如某些数据库内置正则)把 _ 当作特殊符号,此时才需按文档确认是否转义结论:标准 PCRE、JavaScript、Python re、Go regexp 中,_ 就是字面量,写 _ 反而可能引发警告或兼容性问题。
容易被当成通配符但其实是元字符的,必须转义才能表示字面意义:
. → 要匹配真实的小数点,写 .* → 要匹配星号,写 *? → 要匹配问号,写 ?[、]、(、)、{、}、^、$、|、 —— 这些都需前置反斜杠// JS 示例:匹配字符串 "price: $19.99"const regex = /price: $d+.d{2}/;"price: $19.99".match(regex); // ✅ 成功"price: $19.99".match(/price: $.99/); // ❌ $ 是行尾锚点,. 是任意字符下划线本身从不扮演通配角色,真正易错的是把 . 当成万能字符却忽略它的换行限制,以及混淆不同语言中通配符的语义(比如 SQL 的 _ 和正则的 . 完全无关)。