推荐用负向断言(?

怎么写能匹配真实手机号的正则
直接用\d{11}会把身份证号、订单号、时间戳全抓进来,根本不是“电话号码”。Sublime 的词边界\b在中文混排里基本失效,不能依赖它做隔离。
推荐用负向断言确保独立成项:(?。前一个<code>(?防止前面连着数字,后一个<code>(?!\d)防止后面接着数字——这样哪怕前后是中文、标点或空格,也能稳稳命中 11 位手机号。
- 别加
\b:中文文本里它经常漏匹配,尤其前后是全角符号时 - 开头用
1[3-9]比1\d{10}更准,排除非法号段(如 10、11、12) - 如果要兼容带空格/横线的格式(如
138-1234-5678),得额外处理,但会增加误匹配风险;建议先统一清洗再提取
Find All 后复制出来全是乱码?原因和解法
按Ctrl+F输入正则、点Find All后直接Ctrl+C,结果粘贴出来带换行混乱、多余空格,甚至夹杂前缀(比如file.js:45: console.log("13812345678"))——这不是正则写错了,是没控制好匹配粒度。
关键在括号:必须用()把目标内容包住,比如(?。这样<code>Find All选中的只是括号里的 11 位数字,不是整行也不是周边字符。
- 没加括号 → 复制的是整个匹配片段(含前后干扰字符)
- 用了
.*或\s*但没限制 → 容易卷入换行符或不可见空白(如\u3000全角空格) - 粘贴后立刻执行
Ctrl+H,替换^\s+|\s+$为空,清理每行首尾空白
跨文件批量提取时结果带路径前缀,怎么去掉
Ctrl+Shift+F搜完,结果页默认格式是./logs/app.log:123: error 13812345678,直接Ctrl+A→Ctrl+C复制,粘贴出来全是噪音。Sublime 不支持在 Find in Files 里直接引用,所以得靠二次正则清理。
把复制结果粘到新标签页,用Ctrl+H打开替换面板,启用正则模式,填:
^[^:\n]+:\d+:\s*(.*?)(?=\s*$|\n|$)
替换为:$1。这个表达式跳过冒号前所有内容(文件路径+行号),只取冒号后第一个非空字段,且不贪婪吞掉下一行。
- 别用
.*结尾:容易跨行吃掉下一条记录 - Where 栏一定要填路径(如
./src/**/*.js),留空=只搜当前文件,很多人以为扫了全项目 - 大目录下先试小范围,否则扫描卡顿,Sublime 是实时扫描,不做后台索引
为什么测试时匹配成功,正式跑却漏掉几条
常见原因是换行符不一致。Windows 粘贴进来的文本带\r\n,而 Sublime 默认的.不匹配\r,导致138.*1234这种跨行写法失效;更隐蔽的是中文插件可能自动切换语法高亮,干扰换行符识别。
实操解法很简单:按Ctrl+Shift+P输入Set Syntax: Plain Text,切回纯文本模式;右下角点击换行符标识(显示Windows (CRLF)),手动切为Unix (LF)再试。
- 别信“看起来一样”:用
Ctrl+Shift+P→Convert Line Endings to Unix统一处理 - 如果必须保留
\r\n,正则里显式写\r?\n,比如匹配换行后的号码:tel:\r?\n(1[3-9]\d{9}) - 提取后立刻
Ctrl+Shift+P→Convert Case to: Lowercase,避免后续去重因大小写不一致失败











