在除引号外的空格上拆分字符串,但包括不完整的引号
Split string on spaces except for in quotes, but include incomplete quotes
我正在尝试在空格上拆分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"]
相关文章:
- ng消息包括不工作
- 从ES6到HTML的多行模板字符串不包括换行符
- Javascript regexp 在 {{}} 之间获取字符串,但不包括那些包装在 中的字符串
- Javascript:从字符串(包括查询字符串)中提取URL并返回数组
- 错误:GM_setValue不支持的类型.支持的类型包括:字符串、布尔值和 32 位整数
- 如何在 javascript 中查找 html 子字符串,包括 html 字符串中的标记
- 在除引号外的空格上拆分字符串,但包括不完整的引号
- 如何包括“;字符串包括“;函数在角度滤波器内
- 过滤($filter)从对象列表中匹配值,不包括不必要的属性
- Javascript或jquery代码获得整个文本内容的网页内的iframe(包括/不包括该页面的链接)
- 什么是一个很好的和简单的解决方案,包括不加载脚本
- 包括不引人注目的ajax使所有脚本停止工作
- 为什么不't字符串.将(/
/g, '
') work替换为下划线.js - 从第二个页面返回的JSON对象在IE 8中不字符串
- 简单的ng包括不工作
- 柴 期望一个深层数组包括不使用柴不可变
- 网址中的文件名,不包括查询字符串
- 包括不能在chrome浏览器中工作
- 匹配并删除直到并包括"="在字符串与正则表达式
- 节点Ejs模块,包括不工作