为什么嵌套括号会在此正则表达式中导致空字符串?
var str = "ab((cd))ef";
var arr = str.split(/([\)\(])/);
console.log(arr); // ["ab", "(", "", "(", "cd", ")", "", ")", "ef"]
我想要实现的是这个
["ab", "(", "(", "cd", ")", ")", "ef"]
答案 0 :(得分:7)
正则表达式中的外部参数充当捕获组。从split(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)的文档:
如果separator是包含捕获的正则表达式 括号,然后每次分隔符匹配,结果 捕获括号的(包括任何未定义的结果)是 拼接到输出数组中。
你没有准确说出你想要用你的正则表达式实现什么,也许你想要这样的东西:
var str = "ab((cd))ef";
var arr = str.split(/[\)\(]+/);
console.log(arr); // ["ab", "cd", "ef"]
修改强>
每个括号单独匹配正则表达式,因此数组看起来像这样(每个括号匹配一行:
['ab', '('] // matched (
['ab', '(', '', '('] // matched ( (between the last two matches is the empty string
['ab', '(', '', '(', 'cd', ')'] // matched )
['ab', '(', '', '(', 'cd', ')', '', ')'] // matched )
['ab', '(', '', '(', 'cd', ')', '', ')', 'ef'] // string end
<强> EDIT2:强>
必需的输出是:["ab", "(", "(", "cd", ")", ")", "ef"]
我不确定你能用一次拆分做到这一点。最快,最安全的方法就是过滤掉空字符串。我怀疑是否存在针对正则表达式的单个拆分的解决方案。
var str = "ab((cd))ef";
var arr = str.split(/([\)\(])/).filter(function(item) { return item !== '';});
console.log(arr);
答案 1 :(得分:3)
有趣的问题!
我不确定为什么,但如果你链接
.filter(function(el){ return el !== "";});
到你的分裂,你可以摆脱空字符串:
var str = "ab((cd))ef";
var arr = str.split(/([\)\(])/).filter(function(el) { return el !== "";});
console.log(arr); // ["ab", "(", "(", "cd", ")", ")", "ef"]