我有一个像
"asdf a b c2 "
我想把它分成这样的数组:
["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]
使用string.split(" ")
删除空格,结果如下:
["asdf", "a", "", "b", "c2"]
我想插入额外的分隔符,例如
string.replace(/ /g, "| |").replace(/||/g, "|").split("|");
但这给出了意想不到的结果。
我有一个像
"asdf a b c2 "
我想把它分成这样的数组:
["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]
使用string.split(" ")
删除空格,结果如下:
["asdf", "a", "", "b", "c2"]
我想插入额外的分隔符,例如
string.replace(/ /g, "| |").replace(/||/g, "|").split("|");
但这给出了意想不到的结果。
相反分裂的,它可能会以为它是提取字符串包含任何分隔符或连续字符是容易没有分隔符:
'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)
到或(不到
)+。
使用正向前瞻:
"asdf a b c2 ".split(/(?= )/)
// => ["asdf", " a", " ", " b", " c2", " "]
编辑后编辑:正如我在评论中所说,缺乏后视使这有点棘手。如果所有单词都只由字母组成,您可以使用\b
单词边界匹配器伪造lookbehind :
"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", " "]
我很惊讶还没有人提到这一点,但为了完整起见,我将在这里发布。如果表达式中有捕获组,则将.split
捕获的子字符串作为单独的条目包含在结果数组中:
"asdf a b c2 ".split(/( )/) // or /(\s)/
// ["asdf", " ", "a", " ", "", " ", "b", " ", "c2", " ", ""]
请注意,这与您指定的所需输出不完全相同,因为它在两个连续空格之间和最后一个空格之后包含一个空字符串。
如有必要,您可以像这样从结果数组中过滤掉所有空字符串:
"asdf a b c2 ".split(/( )/).filter(String)
// ["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]
但是,如果这是您正在寻找的内容,我可能会建议您使用@Jack的解决方案。
你可以使用一点 jQuery
var toSplit = "asdf a b c2 ".split(" ");
$.each(toSplit,
function(index, value) {
if (toSplit[index] == '') { toSplit[index] = ' '}
}
);
这将创建您正在寻找的输出,而其他元素上没有前导空格。
尝试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"]
在引擎盖下,它使用的逻辑改编自:
escape-string-regexp
把事情弄平。在您的情况下,您可以执行以下操作:
const cleanSplit = require("clean-split");
cleanSplit("asdf a b c2 ", " ");
//=> ["asdf", " ", "a", " ", " ", "b", " ", "c2", " "]