split()与多个空格

时间:2018-05-05 22:11:13

标签: javascript regex split

我正在尝试将字符串中每个单词的第一个字母替换为大写,并通过拆分字符串然后映射每个单词来使其工作,如下所示:

var S = 'hello world';
var x = S.toLowerCase().split(' ').map(word => word[0].toUpperCase() + word.substr(1)).join(' ');

console.log(x);

BUT:

如果字符串包含多个空格,如下所示,则会出现错误 Cannot read property 'toUpperCase' of undefined

var S = 'hello   world';
var x = S.toLowerCase().split(' ').map(word => word[0].toUpperCase() + word.substr(1)).join(' ');

console.log(x);

我尝试将+添加到.split('')和.join(''),如过去的stackoverflow线程中所建议的,如下所示,但仅这样做将第一个单词的第一个字母大写:

var S = 'hello    world';
var x = S.toLowerCase().split(' +').map(word => word[0].toUpperCase() + word.substr(1)).join(' +');

console.log(x); // returns 'Hello    world'

什么是正确的方法呢?

3 个答案:

答案 0 :(得分:3)

您可以使用String.replace()和RegExp将每个单词的第一个字符替换为大写版本:

var S = 'hello   world';
var x = S.toLowerCase().replace(/\b\w/g, (m) => m.toUpperCase());

console.log(x);

如果您仍想使用String.split(),请使用RegExp,并将数组拆分为\s+(一系列空格 - 空格,制表符等等):

var S = 'hello   world';
var x = S.toLowerCase().split(/\s+/).map(word => word[0].toUpperCase() + word.substr(1)).join(' ');

console.log(x);

答案 1 :(得分:1)

首先应该使用正则表达式删除重复的空格。

var S = 'hello    world';
var x = S.replace(/  +/g, ' ').toLowerCase().split(' ').map(word => word[0].toUpperCase() + word.substr(1)).join(' ');

但是如果你想保留这些空间你可能想要使用

var S = 'hello    world';
var x = S.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1);});

答案 2 :(得分:1)

您得到的错误是因为您正在访问空字符串的第一个字符,以下结果相同:

word = ''
word[0].toUppercase() ...

当字符串为空时你必须处理这种情况

word === '' ? word : word[0].toUppercase() ...