连字符单词是由字母、数字通过中间连字符“-”连接组成的词,如user-name、http-response-code;sublime中用正则\b[a-za-z0-9]+(?:-[a-za-z0-9]+)+\b可准确识别,需启用正则模式并用$0\n替换提取。

什么是连字符单词,Sublime 里怎么识别它
连字符单词指由字母、数字通过 - 连接组成的词,比如 user-name、HTTP-response-code、my-app-v2。注意:它**不是**纯英文连写(如 username),也不包含空格或标点(如 user-name. 或 (user-name))。
Sublime 的正则引擎默认不支持 Unicode 字符类的简写(如 \w 匹配中文),所以稳妥起见,用显式字符集:[a-zA-Z0-9]。连字符必须在中间,不能开头或结尾——否则容易误抓 -foo 或 bar-。
匹配逻辑是:「至少一个字母/数字」+「至少一组『-+字母/数字』」,且整体被非字母数字字符包围(或位于行首/尾)。实际用这个正则:
\b[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)+\b
\b 是单词边界,能排除 abc-user-name-def 中只取中间部分的错误切割,也能防止匹配到 email@domain.com 里的 domain.com(因为 . 不是单词字符)。
替换时保留原词,只提取不破坏上下文 你往往不是要删掉它们,而是单独列出来、统计、或导出做后续处理。这时别用空替换,而要用「捕获组 + 引用」方式把匹配内容拎出来。
操作步骤:
- 打开 Sublime,
Ctrl+H(Windows/Linux)或Cmd+H(macOS)调出替换面板 - 开启「正则模式」(右下角
.*按钮点亮) - 查找框填:
\b[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)+\b - 替换框填:
$0\n($0表示整个匹配项,\n换行分隔) - 点「Replace All」,所有匹配词会按行堆在当前文件里
如果想另存为纯列表,可全选结果 → Ctrl+Shift+P → 输入 Copy as Plain Text(或直接复制粘贴到新文件)。注意:不要用 ,因为你没定义捕获组;用 <p>如果想另存为纯列表,可全选结果 → <code>Ctrl+Shift+P → 输入 Copy as Plain Text(或直接复制粘贴到新文件)。注意:不要用 $1,因为你没定义捕获组;用 $0 最安全。
常见漏匹配和误匹配场景
这些地方容易出问题,得手动检查正则是否覆盖到位:
-
API-key✅ 匹配(大写字母算字母);但API-Key❌ 不匹配(K前是-,后面是大写,没问题;真正问题是API-Key被\b正确识别——其实 ✅,除非你关了大小写敏感;默认是区分大小写的,所以没问题) -
user-name_2❌ 不匹配(下划线_不在字符集中,这是对的,因为这不是连字符单词) -
test--double❌ 不匹配(两个连续-,正则中-[a-zA-Z0-9]+要求每个-后必须跟至少一个字母数字符号) -
99-bottles✅ 匹配(数字开头合法) -
foo-bar-baz-qux✅ 匹配(+量词作用于整个非捕获组(?:-[a-zA-Z0-9]+),支持多段)
如果你需要兼容带单引号的缩略形式(如 don't-know),就得扩展字符集,加 ',但此时 \b 可能失效(因为 ' 不是单词字符),得改用 (? 和 <code>(?![a-zA-Z0-9']) 替代 \b——这种需求已超出“快速提取”范畴,建议先确认是否真有这类词。
性能与大文件注意事项
Sublime 对超长行(比如一行几万字符的 JSON 或日志)的正则处理会变慢,甚至卡死。如果目标文本含大段无换行内容:
- 先用
Ctrl+Shift+P→Line Endings: Convert to Unix确保换行符统一,避免正则跨行异常 - 若文件 >5MB,建议先用外部工具预处理(如
grep -oE '\b[a-zA-Z0-9]+(-[a-zA-Z0-9]+)+\b' file.txt | sort -u) - 在 Sublime 内,可临时关闭高亮(
View → Syntax → Plain Text),减少渲染开销 - 别勾选「In Selection」除非你明确圈定了区域——否则可能漏掉滚动外的内容
正则本身没有回溯爆炸风险(没嵌套量词),但 \b 在某些边界场景(如大量标点紧邻)可能触发多次边界检测。如果发现替换极慢,试着把 \b 换成 (? 类前瞻断言,更可控。











