文本处理
文本在线文本处理:大小写转换、排序排重与提取
日常开发里有一类活儿谈不上技术含量,却很占时间:产品给了一列 Excel 复制出来的数据要去重,接口文档的字段名是下划线而前端要驼峰,一堆聊天记录里要把手机号捞出来,或者一段从 PDF 复制来的文本每行都带着多余缩进。为这些事打开 IDE 写脚本不划算,用记事本手动改又容易出错。
这个页面把这类高频操作做成了十个按钮。左边粘贴原文,点一下按钮,右边出结果。每一步都是独立的纯函数变换,不会互相影响,所以可以点「结果作输入」把上一步的结果回填到左侧接着做下一步——比如先「删首尾空格」清掉缩进,再「排重」,最后「排序」,就能把一份脏数据逐步整理成干净清单。两栏顶部实时显示行数与字符数,处理前后一对比就知道去掉了多少条。
提取手机号和邮箱这两个功能,用的是收紧过的正则:手机号要求前后不能紧邻其它数字,避免从一串订单号里误切出 11 位;邮箱允许多级域名和常见的点、连字符。两者都会自动去重,输出每行一个,可以直接贴进表格。需要更灵活的规则时,站内的「正则测试」页可以自定义表达式并预览分组。
和多数在线文本工具相比,这里没有上传、没有登录、没有下载中转,页面加载完就断网也能用。这一点在处理真实业务数据时很实际——一份含真实手机号的名单,本来就不该经过陌生服务器。输入内容只会以草稿形式留在你自己浏览器的 localStorage 中,点「清空」即刻消失。
功能一览
- 转大写/转小写:整段文本统一大小写,常用于把常量名、枚举值或 SQL 关键字对齐成同一风格
- 下划线转驼峰:把 user_name 这类写法改成 userName,用于接口字段与前端变量的命名对齐
- 驼峰转下划线:把 userName 拆成 user_name 并整体转小写,适合生成数据库列名或配置键
- 排序:按行拆分后按字符编码升序排列,相同前缀的行会自动聚到一起
- 排重:按整行去重并保留首次出现的顺序,只有完全相同的行才会被合并
- 删空行:把连续空行与只含空白的行压缩掉,同时去掉文本首尾的空行
- 删首尾空格:去掉整段文本以及每一行开头结尾的空格与制表符,行数保持不变
- 提取手机号/提取邮箱:用正则扫出中国大陆 11 位手机号或邮箱地址,去重后每行输出一个
常见问题
- 输入的文本会上传服务器吗?
- 不会。大小写转换、命名风格转换、排序、去重和正则提取都由页面里的 JavaScript 在你的浏览器中完成,不发起任何网络请求,页面加载后断网也能用。输入与输出会缓存在浏览器 localStorage 里方便下次继续,点「清空」即删除。在公用电脑上处理过客户名单这类内容后,建议顺手清空一次。
- 排序为什么不是按数字大小排的?
- 「排序」用的是 JavaScript 默认的字符串比较,逐字符按 Unicode 码位比大小,所以 10 会排在 9 前面,因为首字符 1 小于 9。想按数值排序,可以先把数字补齐成等长形式,例如 009、010、100,再来排序。中文行同样按码位排列,结果接近 Unicode 顺序而非拼音顺序,需要拼音排序请用表格软件处理。
- 「删空行」和「删首尾空格」有什么区别?
- 「删空行」只处理换行,把连续多个换行合并成一个并去掉首尾空行,每行内部的缩进原样保留,行数会变少。「删首尾空格」处理的是每行两端的空白,会一并去掉行首缩进和行尾多余空格,但不减少行数。想两种效果都要,先点一个按钮,再点「结果作输入」把右侧结果回填到左侧,然后点另一个即可。
- 为什么有些手机号没被提取出来?
- 匹配规则是以 1 开头、第二位为 3 到 9、总长 11 位的连续数字,且前后都不能紧跟其它数字,结果自动去重。所以带分隔符的 138-1234-5678、或前面紧贴 86 而没有空格的号码都不会被识别,可以先把分隔符删掉再提取。极少数老旧浏览器不支持正则的逆序断言,此时会提示执行失败,改用「正则测试」页写一个不含断言的表达式即可。
- 提取邮箱能覆盖哪些写法?
- 规则覆盖绝大多数常见格式,用户名部分允许字母、数字、下划线、连字符和点,域名支持多级,例如 a.b-c@mail.example.com.cn 能被正确提取,结果去重后每行一个。中文域名、带引号的特殊局部名,以及紧贴其它字母而没有分隔的写法可能漏掉。另外提取只保证格式合法,不代表这个邮箱真实存在或能收信。
- 驼峰转下划线后开头多了一个下划线,正常吗?
- 正常。转换规则是把每个大写字母替换成下划线加该字母,再整体转小写,所以首字母大写的 UserName 会得到 _user_name,手动删掉开头那个下划线即可。反方向的下划线转驼峰只把下划线后的字母改成大写,_foo 会变成 Foo。两个转换都按纯字符规则处理,不识别语言语法,注释和字符串字面量里的内容也会被一起改动。