我正在寻找将以下格式的字符串拆分为键值对数组的正则表达式。
"category: Music artist: \"Chris Martin\" album: \"A head full of dreams\" genre: dance"
进入
["category: Music", "artist: \"Chris Martin\"", "album: \"A head full of dreams\"", "genre: dance"]
另外,如何验证字符串是否格式正确,因为每个键都有一个值,如果键或值中有空格,则必须用双引号括起来?
我想出了这个来分割键值对,但它只能在键值用引号括起来并用逗号分隔时才能分开
/(^[^\s:"]+: *"[^"]+"$)|([^"]+: *[^"]+$)/
答案 0 :(得分:2)
您可以通过以下正则表达式获取匹配而不是拆分字符串:
\w+:.*?(?=\s+\w+:|$)
<强> Click for Demo 强>
<强>解释强>
\w+
- 匹配单词字符的1 +次出现,即a-z
,A-Z
,0-9
,_
:
- 匹配:
.*?
- 尽可能少地匹配除换行符之外的任何字符的0次出现(?=\s+\w+:|$)
- 积极前瞻以确保当前位置后跟行尾或1 +空格后跟1 +单词后跟:
<强>代码:强>
var regex = /\w+:.*?(?=\s+\w+:|$)/gm;
var str = "category: Music artist: \"Chris Martin\" album: \"A head full of dreams\" genre: dance";
var objMatch = regex.exec(str);
var arr = new Array();
while(objMatch!=null)
{
arr[arr.length] = objMatch[0];
objMatch = regex.exec(str);
}
for(var i=0; i<arr.length; i++)
{
console.log(arr[i]);
}
&#13;
OR ,您可以使用以下正则表达式执行拆分操作:
\s(?=\w+:)
<强> Click for Demo 强>
<强>解释强>
\s
- 匹配空白(?=\w+:)
- 积极前瞻以确保当前位置必须后跟1个字符后跟:
<强>代码:强>
var regex = /\s(?=\w+:)/gm;
var str = "category: Music artist: \"Chris Martin\" album: \"A head full of dreams\" genre: dance";
var arr = str.split(regex);
for(var i=0; i<arr.length; i++)
{
console.log(arr[i]);
}
&#13;
答案 1 :(得分:1)
您可以使用以下内容获得所需的匹配项:
(\w+):\s?(.+?)(?=\s+\w+:|"?$)
或没有捕获组的情况:
\w+:\s?.+?(?=\s+\w+:|"?$)
查看演示here
<强>解释强>
(\w+):
将匹配以冒号结尾的任何单词,并捕获单词部分。
.+?
会懒惰地匹配任何字符,只要满足下一个条件就会停止匹配。
(?=\s\w+:)
是一种环绕匹配,可在匹配\s\w+:
时停止匹配。这对应于一个空格后跟一个以冒号结尾的单词。