javascript - 按空格分割字符串(引号内除外),但包含不完整的引号

标签 javascript regex string

我试图在 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后面应该跟一个非单词字符。

参见another regex demo

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

关于javascript - 按空格分割字符串(引号内除外),但包含不完整的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34964321/

相关文章:

php - 从字符串重新创建 HTML 文档的正确方法?

javascript - jQuery 验证不适用于 Web 表单

javascript - 在顺序很重要的 javascript 中,是否有更 Eloquent 方法来编写字符串和符号替换?

regex - 如何替换文件中的版本号?

regex - VBA正则表达式单词后的所有内容

java - 查找两个字符串之间的匹配字符

java - 结合 hashCode() 和 equals() 更快?

javascript - 如何在数组的索引处插入重复项?

javascript - jquery如何在运行时获取数据?

Python 字符串末尾有空格和没有空格且不可变