正则拆分字符串后数组中转义空引号元素无法过滤的问题求解
问题分析与解决方法
首先,我们来拆解你的问题根源:
1. 数组元素的实际值并非你看到的"\"\""
你的正则表达式/[^\s"]+|"([^"]*)"/gi在匹配""时,捕获组([^"]*)会捕获到空字符串,所以myArray里对应的元素其实是""(空字符串)。你看到的"\"\""大概率是调试工具的转义显示,或者你混淆了HTML实体和JS字符串的转义规则。
2. 过滤条件的写法错误
你的过滤代码里用了el != '\"\"',这在JS中是无效的:\&不是合法的转义字符,JS会自动忽略这个反斜杠,所以这个字符串实际等价于""""。而你的数组元素是空字符串,自然无法匹配,导致过滤失效。
解决方法
方法一:直接过滤空字符串(最推荐)
既然目标元素是空字符串,直接判断元素是否为空即可:
var arrFiltered = myArray.filter(el => el != null && el !== '');
方法二:如果数组元素确实是""""
如果你的数组元素真的是包含""的字符串(比如正则逻辑有调整),修正过滤字符串的写法,去掉多余的反斜杠:
var arrFiltered = myArray.filter(el => el != null && el !== '""');
额外优化:简化数组构建代码
你原来的do-while循环可以用ES6的matchAll简化,代码更简洁易读:
const testString = '"***100007" "T" "" "" "Regional Office" "n1creditmgmt@mmem.com.au"'; const myRegexp = /[^\s"]+|"([^"]*)"/gi; // 用matchAll一次性获取所有匹配结果,转换为数组 const myArray = Array.from(testString.matchAll(myRegexp), match => match[1] ?? match[0]); // 过滤空元素 const arrFiltered = myArray.filter(el => el !== '');
内容的提问来源于stack exchange,提问作者Anchor Man




