【问题标题】:why do nested parentheses cause empty strings in this regex?为什么嵌套括号会在此正则表达式中导致空字符串?
【发布时间】:2013-11-17 11:02:52
【问题描述】:

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

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

我想要达到的就是这个

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

【问题讨论】:

    标签: javascript regex parentheses


    【解决方案1】:

    正则表达式中的外部参数充当捕获组。来自 split (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split) 的文档:

    如果分隔符是一个包含捕获的正则表达式 括号,然后每次匹配分隔符,结果 (包括任何未定义的结果)的捕获括号是 拼接到输出数组中。

    您没有确切地说出您想用您的正则表达式实现什么,也许您想要这样的东西:

    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); 
    

    【讨论】:

    • 我想要捕获括号,但我不想要空字符串(我已将所需的输出添加到问题中)
    • 所以,它的效果不仅限于括号
    【解决方案2】:

    有趣的问题!

    我不确定为什么,但如果你链接

    .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"]
    

    【讨论】:

      猜你喜欢
      • 2013-01-20
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2014-10-09
      • 2013-06-14
      • 2021-11-01
      相关资源
      最近更新 更多