按空格分割字符串,忽略嵌套字符串中的空格

3

目前,我可以像这样分割字符串:

"1 2 3".split(' ') // [ "1", "2", "3" ]
"1 2 3 'word'".split(' ') // [ "1", "2", "3", "'word'" ]

有没有一种方法可以避免在嵌套字符串中按空格拆分?
例如:
"1 2 3 'word one'".split(' ') // want output of [ "1", "2", "3", "'word one'" ]
"1 2 3 \"word one\"".split(' ') // want output of [ "1", "2", "3", "\"word one\"" ]

我希望输出[ "1", "2", "3", "'word one'" ]而不是[ "1", "2", "3", "'word", "one'" ](即,如果空格在字符串中,则忽略它们)。

3个回答

6

一种方法是使用 match 和一个正则表达式,该正则表达式考虑了引号内的空格:

var s = "1 2 3 \"word one\" one \"two\" 'hello world'";

console.log(s.match(/'[^']+'|"[^"]+"|\w+/g));

编辑:请查看Certain Performance的答案以获得更好的正则表达式。


2
如果字符串后面包含更多的引号字符,例如 1 "2" "3",那么这将匹配太多。\w 还假定是单词字符,但实际情况可能并非如此。 - CertainPerformance

5
为了正确匹配包含额外引号字符的字符串,在匹配带引号的子字符串时,应该使用.+?进行惰性重复,否则会出现这样的字符串:
1 "2" "3"

如果不是所有匹配都只包含单词字符,那么使用\S可能更好,因为它可以匹配除空格字符以外的任何字符,否则可能无法正确匹配。

var s = `1 "2" "3" foo'bar`
console.log(s.match(/'.+?'|".+?"|\S+/g));

或者,为了稍微更高效, 而不是懒惰地重复,使用负字符类:

var s = `1 "2" "3" foo'bar`
console.log(s.match(/'[^']+'|"[^"]+"|\S+/g));


-1

遍历字符串并保持一个布尔标志,以判断您是否在引号内。

if(string[i] == ' ' && !insideQuotes) //split

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