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

时间:2018-11-29 00:32:22

标签: javascript

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

"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 个答案:

答案 0 :(得分:6)

一种方法可以是将match与用于处理引号内空格的正则表达式结合使用:

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

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

编辑:有关更好的正则表达式,请参见Certain Performance's answer

答案 1 :(得分:4)

要正确匹配包含其他引号字符的字符串,请在匹配引号中的子字符串时,将..+?进行懒惰重复,否则将诸如

1 "2" "3"

不能正确匹配。另外,除非您可以指望仅包含单词字符的所有匹配项,否则最好使用\S(它将匹配除空格字符之外的任何字符):

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

或者,要成为slightly more efficient,而不是懒惰的重复,请改用否定字符类:

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

答案 2 :(得分:-1)

遍历字符串,并保留一个布尔标志(如果您在引号内)。

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