传感器原始数据在sublime中乱码是因文件编码不匹配,固件常用gbk或iso-8859-1,而sublime默认utf-8解码;需通过reopen with encoding切换编码,并先清理js、html注释及bom头再正则处理。

为什么传感器原始数据在Sublime里一查就乱码
不是正则写错了,是文件编码根本没对上。传感器固件常默认用 GBK 或 ISO-8859-1 输出,而 Sublime 默认按 UTF-8 解码,ä¸Â文 这类 mojibake 就是典型症状。右下角显示 UTF-8 却满屏乱码?先别碰正则,点 File → Reopen with Encoding 试 Chinese Simplified (GBK) 或 Western (ISO 8859-1) —— 能看清中文或数字,说明编码找对了。
清洗前必须删掉干扰块:JS脚本、HTML注释、BOM头
传感器上报数据混着 Web 页面片段很常见,比如带 <script></script> 块或 <!-- 注释 -->,它们会破坏行结构和字段边界。不先清理,^.*?sensor_id.*$ 这种查找会跨行失效或漏匹配。
- 删 JS:
<script>]*>[\s\S]*?</script>(勾选. matches newline) - 删 HTML 注释:
<!--[\s\S]*?--> - 删 BOM 头(尤其 UTF-8 文件开头的
):^\uFEFF或直接用十六进制查找EF BB BF
注意:]*> 比 <.></.> 更安全,前者不会误吞 alt="A 这类属性里的小于号。
用否定字符集精准提取字段,避开 .*? 的坑
.*? 在传感器日志里极易跨字段——比如 temp=25.3&hum=60&status=OK 中,temp=(.*?)& 看似能取值,但若某条记录含 & 在值里(如 desc=low&battery),就会截断。必须用否定字符集锚定边界。
- 取等号后、下一个
&前的值:temp=([^&]+) - 取引号内内容(如
"voltage": "3.28V"):"voltage": "([^"]+)" - 匹配十六进制传感器 ID(如
id: 0xABC123):id:\s+0x([0-9A-Fa-f]{6})
所有模式都需勾选 Match case 和 . matches newline(如果数据跨行),否则 [^"] 遇换行就停住。
清洗后空行/粘连/乱码的三处致命细节
清洗完发现“温度湿度”连成一块、末尾多出空行、或中文又变方块——问题不在正则,而在三个隐性环节:
- 块级结构丢失:删标签后
<p>25.3</p> <p>60</p>变成25.360,得先替换<p>([^</p>→\n$1\n,再压缩连续空白 - 全角空格没处理:
\s+不匹配中文全角空格(\u3000),得单独搜\u3000替换为空格或删掉 - 文件末尾无换行符:
^$匹配不到最后一行空行,必须用\s*\Z替换,\Z锚定文件结尾,比$可靠
最易被忽略的是:清洗后的文件若仍显示乱码,不是正则失败,而是保存时没选对编码——务必用 File → Save with Encoding → UTF-8,否则下次打开还是 GBK 解码。











