应使用负向断言(?<!\d)1[3-9]\d{9}(?!\d)配合捕获组( )提取纯手机号,弃用\b;Find All后用Ctrl+Shift+P复制选中文本;Replace in Files不支持$1,需改用单文件替换。

直接用 \d{11} 会把身份证后11位、订单号、时间戳全抓出来,根本不是“手机号”——得靠负向断言划清边界,否则提取结果不可用。
为什么 \b1[3-9]\d{9}\b 在中文文本里经常失效
Sublime 的 \b(词边界)依赖 ASCII 字母/数字与非单词字符的切换,在中文混排中前后是全角标点(如“:”、“,”)、空格或换行时,\b 大概率不触发。你写对了正则,但高亮漏掉一半,不是逻辑错,是引擎不认这个边界。
实操建议:
- 彻底弃用
\b,改用负向断言:(? (? 确保前面不是数字(防身份证前11位),<code>(?!\d)确保后面不是数字(防订单号后缀)- 它对中文、全角标点、半角空格、制表符、换行符都稳定生效
- 别加
^和$——实际文本里手机号极少独占整行,加了反而漏匹配
怎么让 Find All 复制出来就是干净的 11 位数字
没加捕获组时,Find All 选中的是整个匹配片段(含前后空格、冒号、括号等干扰字符),Ctrl+C 粘贴后全是脏数据。关键不是“找得对”,是“选得准”。
实操建议:
- 必须用括号把目标包住:
(? - 这样
Find All后按Ctrl+Shift+P→Copy Selected Text,复制出的就是纯13812345678 - 避免用
.*或\s*包裹,它们可能吞掉换行符或全角空格,导致跨行粘连 - 如果原始文本有空格/横线分隔(如
138-1234-5678),先统一清洗:Ctrl+H替换-|\s为空,再跑手机号正则
为什么 Replace in Files 里 $1 不起作用
这是 Sublime 的硬限制:Ctrl+Shift+H(全局替换)面板完全不支持捕获组引用,$1 会被当字面字符串输出。很多人调半天正则,其实是功能压根不可用。
实操建议:
- 批量提取只走
Ctrl+F→Find All→Copy Selected Text这条路径 - 需要重构格式(如加前缀、转 JSON)?在新文件里用
Ctrl+H(当前文件替换)配合$1处理 - 别在
Replace in Files里写$1——它不会报错,但也不会生效,只会原样输出 - 验证分组是否正确:在单文件里用
Ctrl+H,查找(?,替换为 <code>【$1】,看是否只包住 11 位数字
真正难的不是写出能高亮的正则,而是确保它在中文混排、全角空格、Windows 换行符(\r\n)、汉化界面插件共存的环境下,依然稳定输出干净的 11 位数字——负向断言 + 显式捕获组 + 避开全局替换陷阱,这三步缺一不可。

















