JavaScript使用空格分割字符串

88

我想要拆分一个字符串,但我希望保留空格,例如:

var str = "my car is red";

var stringArray [];

stringArray [0] = "my";
stringArray [1] = " ";
stringArray [2] = "car";
stringArray [3] = " ";
stringArray [4] = "is";
stringArray [5] = " ";
stringArray [6] = "red";

我该怎样继续做那件事?

谢谢!

8个回答

125

使用正则表达式:

var str   = "my car is red";
var stringArray = str.split(/(\s+)/);

console.log(stringArray); // ["my", " ", "car", " ", "is", " ", "red"] 

\s 匹配任何空白字符,添加加号使其贪婪匹配以字符开头且以空格结尾的组,下一个组在空格后有字符时开始等。


哦,这真的有效。你能解释一下 filter 在做什么吗?乍一看它似乎是无效的,因为 filter 回调应该返回 truefalse - Lightness Races in Orbit
2
你是救命恩人。对于我的特殊情况,没有其他东西能够起作用! - ShieldOfSalvation
16
您可能需要:var stringArray = str.split(/\s+/); 以便在数组中不包含空格。 - run_the_race
@run_the_race 你能解释一下他为什么保留了空格吗? - Minh Nghĩa
3
如果分隔符是包含捕获括号()的正则表达式,则匹配结果会被包含在数组中。 - run_the_race

65

你可以根据空格将字符串分割成多个部分,然后再重新添加它们,因为你知道空格是每个条目之间的分隔符。

var string = "text to split";
    string = string.split(" ");
var stringArray = new Array();
for(var i =0; i < string.length; i++){
    stringArray.push(string[i]);
    if(i != string.length-1){
        stringArray.push(" ");
    }
}

这种方法在处理双空格时效果不佳。"text to split"("text to"之间有2个空格)=> ["text", " ", "", " ", "to", " ", "split"] - Rhumborl
@Rhumborl 不,它没有,但你可以加入这个功能。不过,它能做到标签上所说的事情。自然文本不包含双空格。如果你需要它,你可以在循环开始处添加 if(string[i] === "") continue; 来忽略任何空值。 - somethinghere

50

用于像Python语言中按空格拆分字符串的方法:

var w = "hello    my brothers    ;";
w.split(/(\s+)/).filter( function(e) { return e.trim().length > 0; } );

输出:

["hello", "my", "brothers", ";"]

或类似:

w.split(/(\s+)/).filter( e => e.trim().length > 0)

(输出一些内容)


1
w.split(/(\s+)/).filter( e => e.length > 1) - Anthony Awuley
4
之前的评论是错误的。 'a boy'.split(/(\s+)/).filter( e => e.length > 1) 返回 ["boy"]。 - user2191332

8
你可以使用\b来分割单词边界。请参考MDN\b:匹配零宽度的单词边界,例如字母和空格之间。 你还应该确保后面跟着空白字符\s。这样像"My car isn't red"这样的字符串仍然有效。
var stringArray = str.split(/\b(\s)/);

初始的\b是必需的,以考虑多个空格,例如my car is red

编辑:添加分组


4
我不建议这么做。\b不仅匹配字母和空格之间的边界,还匹配字母和标点符号之间的边界,例如:"Bob's e-mail is a@b.com" 会被分割成 ["Bob", "'", "s", " ", "e", "-", "mail", " ", "is", " ", "a", "@", "b", ".", "com"]。 - Shai
@Shai,没错,我还添加了空格检查。 - Rhumborl

6

虽然并非所有浏览器都支持此功能,但如果您在正则表达式中使用捕获括号,则捕获的输入将被拼接到结果中。

如果分隔符是包含捕获括号的正则表达式,则每次匹配分隔符时,捕获括号的结果(包括任何未定义的结果)都将被拼接到输出数组中。[参考]

因此:

var stringArray = str.split(/(\s+)/);
                             ^   ^
//

输出:

["my", " ", "car", " ", "is", " ", "red"]

这会折叠原始输入中连续的空格,但除此之外,我想不到任何问题。


3

如果你确定两个单词之间只有一个空格,你可以使用以下方法:

str.replace(/\s+/g, ' ').split(' ')

它会将一个空格替换成两个空格,并以空格为分隔符进行分割。


2
str.split(' ').join('§ §').split('§');

2
您可以使用以下的代码来在split函数中使用两个空格进行分割:
str.split("  ");

这将使用空格分隔字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接