为什么嵌套括号会在此正则表达式中导致空字符串?

时间:2013-11-17 11:02:52

标签: javascript regex parentheses

为什么嵌套括号会在此正则表达式中导致空字符串?

var str = "ab((cd))ef";
var arr = str.split(/([\)\(])/);
console.log(arr); // ["ab", "(", "", "(", "cd", ")", "", ")", "ef"] 

我想要实现的是这个

["ab", "(", "(", "cd", ")", ")", "ef"] 

2 个答案:

答案 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"]