我试图在 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+
参见regex demo .
在这里,"\b[^"]*\b"
匹配"
后跟一个单词字符,然后匹配除 "
之外的零个或多个字符然后是 "
前面有一个单词字符。
朝着这个方向进一步前进,我们可以做到:
\B"\b[^"\n]*\b"\B|\S+
与 \B"
我们要求"
前面应该有一个非单词字符,并且 "\B
后面应该跟一个非单词字符。
很大程度上取决于您对具体输入的具体问题!
关于javascript - 按空格分割字符串(引号内除外),但包含不完整的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34964321/