JavaScript分割空格分隔的字符串并修剪额外的逗号和空格

14
我需要将一个关键词字符串拆分并转换成逗号分隔的字符串。然而,我需要去掉额外的空格和用户已经输入的逗号。
var keywordString = "ford    tempo, with,,, sunroof";

将输出写入此字符串:

ford,tempo,with,sunroof,
我需要在最终输出中保留尾随逗号并且没有空格。
不确定是否应该使用正则表达式或字符串分割函数。
有人已经做过这样的事情吗?
我需要使用JavaScript(或JQ)。
编辑(解决方案已工作):
var keywordString = ", ,, ford,    tempo, with,,, sunroof,, ,";

//remove all commas; remove preceeding and trailing spaces; replace spaces with comma

str1 = keywordString.replace(/,/g , '').replace(/^\s\s*/, '').replace(/\s\s*$/, '').replace(/[\s,]+/g, ',');


//add a comma at the end
str1 = str1 + ',';

console.log(str1);

jQuery不是一个字符串操作库... - Alnitak
6个回答

34
您需要在两种情况下使用正则表达式。您可以拆分并连接字符串:
str = str.split(/[\s,]+/).join();

这个函数会按照连续的空格和逗号进行分割和消耗。同样地,你也可以只匹配并替换这些字符:
str = str.replace(/[\s,]+/g, ',');

对于尾随逗号,只需添加一个即可。
str = .... + ',';

如果您有前导或尾随的空格,应该先将其删除。
参考资料:.split.replace正则表达式

+1 这个完美运作,唯一的小问题是它没有尾随逗号。由于他希望在最终输出中包含它,你可能想要加上它以保证完整性。 - Josh Mein
如果有空格和逗号在末尾,我会得到一个额外的逗号。请参见我的上面的编辑或:http://jsfiddle.net/TheFiddler/MraW9/ - User970008
你为什么要使用这么多的替换函数?除了从开头/结尾修剪空格之外,还要修剪逗号。 - Felix Kling
搞定了。我必须先替换逗号,然后再替换空格。 - User970008
+1 每一天都是上学的日子,原来可以使用正则表达式模式进行分隔,之前并不知道。 - Phil Cooper
jsfiddle http://jsfiddle.net/TheFiddler/MraW9/ 对于正确的输入(即“first,second,third”)无法正常工作...为了修复这个问题,请将 (/,/g , '') 替换为 (/,/g , ' ') 并确保它是第一个替换。 - Danny Mahoney

9

ES6中:

var temp = str.split(",").map((item)=>item.trim());

在这种情况下,trim 只是删除空格。例如,考虑我们在拆分后得到以下内容:["foo"," bar", " ", "foobar"],经过以上函数处理后,结果将为["foo","bar", "", "foobar"]。 - Rahul
1
@Rahul 只需添加一个过滤函数,如:str.split(",").map(item=>item.trim()).filter(item=>item!=="") - Aaron
在分割后添加trim会增加很多开销,被接受的答案更有效率,因为它使用正则表达式/[\s,]+/一次完成操作,而与此答案相比,它需要至少2次操作,而我之前的评论甚至更糟糕,需要3次操作。 - ghiscoding

6
Felix Kling答案外,还应该先删除前导和尾随的空格。可以通过挂接到JavaScript String原型来添加“扩展方法”以去除前导和尾随空格,以下是我一直在使用的代码,非常好用:
// trims the leading and proceeding white-space
String.prototype.trim = function()
{
    return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
};

1
我会简单明了地保持它,只匹配任何不允许加入的内容,而不是连接它:
str.split(/[^a-zA-Z-]+/g).filter(v=>v);

这将匹配所有的缺口,无论中间有什么非允许字符。为了去除开头和结尾的空条目,只需使用一个简单的非空值过滤器即可。请参见regex101上的详细解释

var str = ", ,, ford,    tempo, with,,, sunroof,, ,";

var result = str.split(/[^a-zA-Z-]+/g).filter(v=>v).join(',');

console.info(result);


0
let query = "split me by space and remove trailing spaces and store in an array  ";
let words = query.trim().split(" ");
console.log(words)

输出: [ 按空格分割字符串,并删除末尾空格,将结果存储在数组中 ]

-1
如果您只想使用 lodash分割、修整合并,同时保留空格,可以使用以下代码:

// The string to fix
var stringToFix = "The Wizard of Oz,Casablanca,The Green Mile";

// split, trim and join back without removing all the whitespaces between
var fixedString = _.map(stringToFix.split(','), _.trim).join(' == ');

// output: "The Wizard of Oz == Casablanca == The Green Mile"
console.log(fixedString);
<script src="https://cdn.jsdelivr.net/lodash/4.16.3/lodash.min.js"></script>


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