NodeJS正则匹配异常:WebSocket数据中\0转\u0000致提取失败
解决WebSocket数据中的1234提取问题
我来帮你搞定这个正则提取的麻烦!首先咱们先理清楚你的数据情况:你拿到的WebSocket数据是TEST|1234\0,这里的\0其实是ASCII码0对应的Unicode字符\u0000(空字符),之前的正则没匹配到预期结果,主要是没考虑这个空字符的存在。
先分析你之前的正则问题
- 第一个正则
/\|(.*?)\\/:你可能误以为数据里有字面量的\,但实际是\u0000空字符,这个正则完全没匹配到目标,所以返回null。 - 第二个正则
/\|(.*)/:它匹配了|后面的所有内容,包括1234和最后的空字符,所以结果是|1234\u0000,不是你要的纯1234。
给你两个靠谱的解决方案
方案一:精准匹配到空字符前的内容
用正则匹配|后面、空字符\u0000之前的所有字符,正则写成/\|([^\u0000]+)/,其中[^\u0000]+表示除了空字符之外的任意字符(至少一个),刚好能提取到1234:
var data = 'TEST|1234\\0'; // 实际存储为TEST|1234\u0000 var regex = /\|([^\u0000]+)/; var matchResult = data.match(regex); if (matchResult) { console.log(matchResult[1]); // 输出:1234 }
方案二:用字符串分割更直观
如果你的数据格式固定是「前缀|内容\0」,也可以不用正则,直接分割+替换,代码更易懂:
var data = 'TEST|1234\\0'; // 先按|分割取后半部分,再去掉末尾的空字符 var target = data.split('|')[1].replace('\u0000', ''); console.log(target); // 输出:1234
扩展:全局匹配多个片段
如果数据里有多个类似|内容\0的片段,把正则改成全局模式/\|([^\u0000]+)/g,用matchAll遍历所有匹配结果:
var data = 'TEST|1234\\0|USER|5678\\0'; var regex = /\|([^\u0000]+)/g; for (const match of data.matchAll(regex)) { console.log(match[1]); // 依次输出:1234、5678 }
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

