按空格拆分字符串,但忽略引号中的空格

3

我希望能够使用split()方法将任何字符串通过空格分割成数组。但是,我希望忽略引号中的空格。

例如:

'word "words in double quotes"'

它应该变成一个数组,其中包含:

[
  'word',
  'words in double quotes'
]

我看了一些类似的答案,它们通常会给出一个数组:

[
  'word',
  '"words in double quotes"'
]

而这不是我要找的。我不想将引号添加到数组元素中。

我可以使用什么正则表达式?


2
仅使用 split 是不可能的,因为 split 无法移除最后一个引号,除非再引入另一个 split。你可以尝试使用 `const [match, first, second] = string.match(/^(.) "(.)"$/)。 - le_m
也许是'word "words in double quotes"'.split(/"(.*?)"|\s+/g).filter(Boolean),但取决于引号内的引号如何转义。 - Slai
1
这个回答解决了你的问题吗?Javascript将字符串按空格或引号分割为数组 - ggorlen
3个回答

2
我认为仅使用 String.prototype.split 是无法实现您想要的结果的,因为它的使用很可能会导致结果数组中出现空字符串;这只是针对您提供的字符串而言。如果您需要一个通用解决方案来解决问题,我认为 split 根本就行不通。
如果您的目标是产生与实际字符串无关的相同结果,我建议您使用 String.prototype.match[].mapString.prototype.replace 的组合,如下所示: 代码:

var
  /* The string. */
  string = 'apples bananas "apples and bananas" pears "apples and bananas and pears"',

  /* The regular expression. */
  regex = /"[^"]+"|[^\s]+/g,

  /* Use 'map' and 'replace' to discard the surrounding quotation marks. */
  result = string.match(regex).map(e => e.replace(/"(.+)"/, "$1"));
  
console.log(result);


正则表达式的解释:

  • "[^"]+":捕获两个引号之间的任意字符序列(至少1个字符),但不包括引号本身。
  • |:逻辑或。
  • [^\s]+:捕获任意非空格字符序列(至少1个字符)
  • g:全局标志 - 匹配所有出现的情况。

抱歉,我是指word "words with double quotes"字符串作为一个例子。正则表达式应该适用于任何字符串,比如command arg1 "arg 2" arg3或者apples bananas "apples and bananas"。我已经修正了帖子中的措辞,以消除任何困惑。 - kerabite
再看一下我的答案@insertcodehere。我已经更新了它以匹配任何给定的字符串。希望这对你有所帮助。 - Angel Politis
非常感谢你的帮助!@Angel Politis - kerabite
另外,虽然这是一个可以接受的答案,但是否可能将 map() 方法移除,只是以某种方式将其实现到正则表达式中? - kerabite

0

希望这是你要找的:

var words = 'word "words in double quotes" more text "stuff in quotes"';
var wordArray = words.match(/"([^"]+)"|[^" ]+/g);
for(var i=0,l=wordArray.length; i<l; i++){
  wordArray[i] = wordArray[i].replace(/^"|"$/g, '');
}
console.log(wordArray);


不确定为什么这个被投票否决了,它运行得很好。我还进行了jsbench测试,这个更快。这个应该是被接受的答案,而不是Angel Politis的那个。 - moeiscool

0
  • 通过"
  • 将初始字符串拆分。
  • 通过空格将#1结果中的每个奇数项拆分。
  • 使用正则表达式会极大地影响代码的可读性和可维护性,特别是当你试图解决现有限制时(比如缺少逆向查找)。


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