分享
三行代码  ›  专栏  ›  技术社区  ›  ynn

JavaScript无法正确拆分字符串

  •  0
  • ynn  · 技术社区  · 1 周前

    根据 ECMA-262 §21.1.3.19 String.prototype.split ,

    String.prototype.split ( separator, limit )

    这些事件不是返回数组中任何子字符串的一部分,而是用来分割字符串值 .

    let s = new String("All the world's a stage, And all the men and women merely players;");
    console.log(s.split(/( |o)men /));
    

    预期产量:

    [
      "All the world's a stage, And all the",
      'and w',
      'merely players;'
    ]
    

    [
      "All the world's a stage, And all the",
      ' ',
      'and w',
      'o',
      'merely players;'
    ]
    

    这里发生了什么事?我该怎么写才能和“男人”或“预兆”匹配呢?


    环境:

    ~ $ node --version
    v13.8.0
    

    为了我的笔记:

    import re
    s = "All the world's a stage, And all the men and women merely players;"
    print(re.compile("( |o)men ").split(s))
      #=> ["All the world's a stage, And all the", ' ', 'and w', 'o', 'merely players;']
    print(re.compile("(?: |o)men ").split(s))
      #=> ["All the world's a stage, And all the", 'and w', 'merely players;']
    

    也许有合理的理由或者实际的用例来解释这种奇怪的(至少对我来说)行为。。。

    2 回复  |  直到 1 周前
        1
  •  2
  •   Nick    1 周前

    字符串.prototype.split spec 还说(在同一段中):

    分隔符的值可以是任意长度的字符串,也可以是具有@@split方法的对象(如RegExp)。

    如果我们看一下 RegExp.prototype [ @@split ] ,上面写着:

    这就解释了你所看到的行为。要解决这个问题,只需使用一个非捕获组,即。

    let s = new String("All the world's a stage, And all the men and women merely players;");
    console.log(s.split(/(?: |o)men /));

    或者, for better performance

    let s = new String("All the world's a stage, And all the men and women merely players;");
    console.log(s.split(/[ o]men /));
        2
  •  2
  •   ksav    1 周前

    String.prototype.split()

    找到时,将从字符串中移除分隔符,并在数组中返回子字符串。

    如果分隔符是带捕获括号的正则表达式