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

时间:2014-07-01 06:36:12

标签: javascript jquery

我有一个像

这样的字符串
 "asdf a  b c2 "

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

["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]

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

["asdf", "a", "", "b", "c2"]

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

string.replace(/ /g, "| |").replace(/||/g, "|").split("|");

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

6 个答案:

答案 0 :(得分: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%", " ", "*", " "]

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

'asdf a  b c2 '.match(/ |[^ ]+/g)

或(不到)+。

答案 1 :(得分:9)

使用积极向前看:

"asdf a  b c2 ".split(/(?= )/)
// => ["asdf", " a", " ", " b", " c2", " "]

编辑后编辑:正如我在评论中所说,缺乏外观让人觉得有点棘手。如果所有单词都只包含字母,则可以使用\b单词边界匹配器伪造背后隐藏:

"asdf a  b c2 ".split(/(?= )|\b/)
// => ["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]

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

"asdf-eif.b".split(/(?= )|\b/)
// => ["asdf", "-", "eif", ".", "b"]

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

后期思考编辑:这是基于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", " "]

答案 2 :(得分:5)

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

"asdf a  b c2 ".split(/( )/)  // or /(\s)/
// ["asdf", " ", "a", " ", "", " ", "b", " ", "c2", " ", ""]

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

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

"asdf a  b c2 ".split(/( )/).filter(String)
// ["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]

但是,如果您正在寻找这个,我建议您选择@Jack's solution

答案 3 :(得分:0)

你可以使用一点jQuery

var toSplit = "asdf a  b c2 ".split(" ");
$.each(toSplit, 
    function(index, value) { 
        if (toSplit[index] == '') { toSplit[index] = ' '} 
    }
);

这将创建您正在寻找的输出,而不会在其他元素上使用前导空格。

答案 4 :(得分:0)

尝试clean-split

const cleanSplit = require("clean-split");

cleanSplit("a-b-c", "-");
//=> ["a", "-", "b", "-", "c"]

cleanSplit("a-b-c", "-", { anchor: "before" });
//=> ["a-", "b-", "c"]

cleanSplit("a-b-c", "-", { anchor: "after" });
//=> ["a", "-b", "-c"]

在引擎盖下,它使用的逻辑适用于:

根据您的情况,您可以执行以下操作:

const cleanSplit = require("clean-split");

cleanSplit("asdf a  b c2 ", " ");
//=> ["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]

答案 5 :(得分:-2)

"asdf a  b c2 ".split(' ').join(' ,');