为什么同一个正则表达式在不同语言里表现不一样
PCRE、JavaScript的RegExp、Python的re等引擎虽然共享大部分基础语法,但在细节上有差异,比如\d是否只匹配ASCII数字,或者是否支持后行断言(lookbehind),因此在一个环境里测试通过的正则表达式,换到另一个语言里未必能得到完全相同的结果。
正则表达式擅长模式匹配,而不是真正的结构化解析
对于HTML、JSON这类真正结构化的格式,单纯用正则表达式处理,复杂度一旦上升就容易变得脆弱、难以维护。它真正擅长的是行级别、扁平结构的校验和提取,比如判断一个字符串是否符合邮箱的大致格式,或者从字符串中把数字部分抽取出来。
常见问题
为什么匹配到的内容比预期的要多?
通常是贪婪量词匹配了比预期更长的内容,可以尝试改成懒惰写法(*?或+?),或者用更精确的字符类代替范围过大的通配符。
捕获组和非捕获组有什么区别?
捕获组(模式)会把匹配到的文本保存下来,方便之后引用(比如在替换字符串里使用);非捕获组(?:模式)只影响分组和量词的作用范围,不会保存任何内容。