在除引号外的空格上拆分字符串,但包括不完整的引号

Split string on spaces except for in quotes, but include incomplete quotes

本文关键字:包括不 字符串 空格 拆分      更新时间:2023-09-26

我正在尝试在空格上拆分JS中的字符串,除非空格在引号中。 但是,应保持不完整的报价。 我不擅长正则表达式魔法,并且一直在使用以下正则表达式:

var list = text.match(/[^'s"]+|"([^"]*)"/g)

但是,如果我提供像sdfj "sdfjjk这样的输入,这将变得["sdfj","sdfjjk"]而不是["sdfj",""sdfjjk"]

您可以使用

var re = /"([^"]*)"|'S+/g;

通过使用'S (= [^'s]),我们只是从否定字符类中删除"。通过将"([^"]*)"模式放在'S+之前,我们确保引号中的子字符串在出现之前时不会被撕裂。如果字符串包含配对良好的带引号的子字符串,并且最后一个子字符串未配对,则这应该有效。

演示:

var re = /"([^"]*)"|'S+/g; 
var str = 'sdfj "sdfjjk';
document.body.innerHTML = JSON.stringify(str.match(re));

请注意,要在引号之间获取捕获的文本,您需要在循环中使用RegExp#exec(因为String#match"删除"子匹配)。

更新

不知道反对票时是怎么想的,但让我猜猜。引号通常用于单词字符周围。如果有"百搭"引号,它仍然是单词前后的引号。

因此,我们可以像这样使用单词边界:

"'b[^"]*'b"|'S+

请参阅正则表达式演示。

在这里,"'b[^"]*'b"匹配后跟单词字符的",然后匹配除"以外的零个或多个字符,然后后跟前面带有单词字符的"

在这个方向上更进一步,我们可以做到:

'B"'b[^"'n]*'b"'B|'S+

对于'B",我们要求"前面应该有一个非单词字符,"'B后面应该有一个非单词字符。

查看另一个正则表达式演示

很大程度上取决于您对特定输入的具体问题!

尝试以下操作:

text.match(/".*?"|[^'s]+/g).map(s => s.replace(/^"(.*)"$/, "$1"))

这会重复查找正确引用的子字符串(第一个)或其他非空格序列。map部分是删除带引号的子字符串周围的引号。

> text = 'abc "def ghi" lmn "opq'
< ["abc", "def ghi", "lmn", ""opq"]