【问题标题】:Ignore regex capturing group when using javascript split [duplicate]使用javascript拆分时忽略正则表达式捕获组[重复]
【发布时间】:2016-03-03 05:26:24
【问题描述】:

我正在尝试将一个字符串拆分为一个数组,并希望得到一个具有以下格式的数组:['a','b', 'c']

const code = "/*_ ex1.js */a/*_ ex2.js */b/*_ ex3.js */c"
code.split(/\/\*_.+?\*\//)

=>(这就是我想要的)

['a','b', 'c']

但是当我尝试确保正则表达式适用于新行时

code.split(/\/\*_(.|\s)+?\*\//)

=>(不是我想要的)

[' ', 'a', ' ', 'b', ' ', 'c']

我不知道这些额外的空间是从哪里来的。这显然与括号捕获组有关,但我不明白如何解决这个问题。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    split 在输出中包含任何捕获组的内容。来自MDN

    如果separator是包含捕获括号的正则表达式,则每次匹配separator时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。

    在您的情况下,(.|\s) 是一个捕获组。因此,空格将包含在您的输出中。解决此问题的最简单方法是使用?: 使其成为非捕获组:

    code.split(/\/\*_(?:.|\s)+?\*\//)
                      ^^
    

    这仍然会在结果数组中留下一个初始空字符串。 (您最初的非多行版本也是如此。)没有办法解决这个问题,因为您的拆分器正好位于字符串的开头,因此左侧的标记是一个空字符串。如果你想摆脱它,你可以过滤掉它:

    .filter(Boolean)
    

    【讨论】:

      【解决方案2】:

      尝试使用String.prototype.match()RegExp /[a-z](?=\/|\n|$)/g 来匹配字符类az,后跟/ 字符或换行符或输入结束

      const code = "/*_ ex1.js */a/*_ ex2.js */b/*_ ex3.js */c\n"
                   + "/*_ ex4.js */d/*_ ex5.js */e/*_ ex6.js */f";
      var res = code.match(/[a-z](?=\/|\n|$)/g);
      console.log(res);

      【讨论】:

        猜你喜欢
        • 2018-10-29
        • 1970-01-01
        • 2018-10-30
        • 1970-01-01
        • 2022-01-22
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多