将字符串拆分为数组而不删除分隔符?

gan*_*lf3 18 javascript jquery

我有一个字符串

 "asdf a  b c2 "
Run Code Online (Sandbox Code Playgroud)

我想将它拆分成这样的数组:

["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]
Run Code Online (Sandbox Code Playgroud)

使用string.split(" ")删除空格,结果如下:

["asdf", "a", "", "b", "c2"]
Run Code Online (Sandbox Code Playgroud)

我想插入额外的分隔符,例如

string.replace(/ /g, "| |").replace(/||/g, "|").split("|");
Run Code Online (Sandbox Code Playgroud)

但这会产生意想不到的结果.

Ja͢*_*͢ck 20

相反分裂的,它可能会以为它是提取字符串包含任何分隔符或连续字符是容易没有分隔符:

'asdf a  b c2 '.match(/\S+|\s/g)
// result: ["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]
'asdf a  b. . c2% * '.match(/\S+|\s/g)
// result: ["asdf", " ", "a", " ", " ", "b.", " ", ".", " ", "c2%", " ", "*", " "]
Run Code Online (Sandbox Code Playgroud)

莎士比亚对比赛的更多定义是:

'asdf a  b c2 '.match(/ |[^ ]+/g)
Run Code Online (Sandbox Code Playgroud)

or (not to )+.

  • @ gandalf3`\S`与`\ s`相反.它也可以写成`[^\s]`. (2认同)

Ama*_*dan 9

使用正向前瞻:

"asdf a  b c2 ".split(/(?= )/)
// => ["asdf", " a", " ", " b", " c2", " "]
Run Code Online (Sandbox Code Playgroud)

编辑后编辑:正如我在评论中所说,缺乏外观使得这有点棘手.如果所有单词都只包含字母,您可以使用\b单词边界匹配器伪造lookbehind :

"asdf a  b c2 ".split(/(?= )|\b/)
// => ["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]
Run Code Online (Sandbox Code Playgroud)

但是一旦你得到一些标点符号,它就会崩溃,因为它不仅会在空格上打破:

"asdf-eif.b".split(/(?= )|\b/)
// => ["asdf", "-", "eif", ".", "b"]
Run Code Online (Sandbox Code Playgroud)

如果你确实有非字母,你不想打破,那么我也会建议一个后处理方法.

后思考编辑:这是基于JamesA的最初想法,但精炼为不使用jQuery,并正确分割:

function chop(str) {
  var result = [];
  var pastFirst = false;
  str.split(' ').forEach(function(x) {
    if (pastFirst) result.push(' ');
    if (x.length) result.push(x);
    pastFirst = true;
  });
  return result;
}
chop("asdf a  b c2 ")
// => ["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]
Run Code Online (Sandbox Code Playgroud)


p.s*_*w.g 5

我很惊讶没人提到这个,但为了完整起见,我会在这里发布.如果在表达式中有捕获组,则将.split捕获的子字符串作为结果数组中的单独条目包括在内:

"asdf a  b c2 ".split(/( )/)  // or /(\s)/
// ["asdf", " ", "a", " ", "", " ", "b", " ", "c2", " ", ""]
Run Code Online (Sandbox Code Playgroud)

请注意,这与您指定的所需输出不完全相同,因为它在两个连续空格之间和最后一个空格之后包含一个空字符串.

如有必要,您可以过滤掉结果数组中的所有空字符串,如下所示:

"asdf a  b c2 ".split(/( )/).filter(String)
// ["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]
Run Code Online (Sandbox Code Playgroud)

但是,如果这是您正在寻找的,我可能会建议您使用@Jack的解决方案.