我们先从最让人头疼的一个问题说起。

为什么 `$1` 不生效,反而打出了字面量的 `$1`?

这是新人最容易踩的坑。在“查找”框里,我们习惯用 `\1` 来引用第一个捕获组,这是多数正则引擎的通用写法。但到了 Sublime 的“替换”框里,规则变了:它**拒绝**识别反斜杠数字引用,只认美元符号加数字,也就是 `$1`。

跨行匹配:为什么 `.*` 总是停在第一行末尾?

这是另一个高频问题。默认情况下,正则中的点号 `.` 是不匹配换行符 `\n` 的。所以,当你试图用 `function.*{` 去匹配一个跨越多行的函数体时,它只会匹配到第一行末尾,函数体内部的 `{` 根本找不到。

中文匹配失败:`[u4e00-u9fa5]` 为什么一个字都找不到?

这个问题,十有八九不是正则写错了,而是 Sublime 读取文件时的编码识别出了问题。尤其在 Windows 系统下,一个 UTF-8 无 BOM 的文件很容易被 Sublime 错误地解析为 GBK,导致所有中文字符都变成了乱码,正则自然无法匹配。

一个实战案例:如何安全地把 `_xxx_yyy` 转成驼峰,又不误伤 `__init__` 或 `name_`?

直接搜 `_([a-z])` 并替换成 `\U$1` 是非常危险的。它会错误地把 `__dict__` 变成 `_Dict__`,也会把 `name_` 末尾的下划线错转成 `name`。

说到底,真正麻烦的从来不是写对正则本身,而是你没法一眼看穿它到底匹配了哪些隐藏的“陷阱”——看不见的空格、换行符、BOM头、注释、字符串内的引号、缩进层级……每一个都可能让 `.*?` 失效,或者让 `$1` 落空。所以,动手前,花十秒钟看看状态栏的编码,点一次 `Find All`,在最小样本上测试一下,这比事后花十倍时间恢复数据要高效得多。

本文转载于:https://www.php.cn/faq/2346786.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。