目前,我可以像这样分割字符串:
"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'" ]
(即,如果它们在字符串中,我想忽略空格)。
答案 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