正则表达式从Javascript中的字符串中拆分键值对(键:值键:" va lue")

时间:2018-02-22 16:11:05

标签: javascript regex regex-group

我正在寻找将以下格式的字符串拆分为键值对数组的正则表达式。

"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:"]+: *"[^"]+"$)|([^"]+: *[^"]+$)/

2 个答案:

答案 0 :(得分:2)

您可以通过以下正则表达式获取匹配而不是拆分字符串:

\w+:.*?(?=\s+\w+:|$)

<强> Click for Demo

<强>解释

  • \w+ - 匹配单词字符的1 +次出现,即a-zA-Z0-9_
  • : - 匹配:
  • .*? - 尽可能少地匹配除换行符之外的任何字符的0次出现
  • (?=\s+\w+:|$) - 积极前瞻以确保当前位置后跟行尾或1 +空格后跟1 +单词后跟:

<强>代码:

&#13;
&#13;
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;
&#13;
&#13;

OR ,您可以使用以下正则表达式执行拆分操作:

\s(?=\w+:)

<强> Click for Demo

<强>解释

  • \s - 匹配空白
  • (?=\w+:) - 积极前瞻以确保当前位置必须后跟1个字符后跟:

<强>代码:

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用以下内容获得所需的匹配项:

(\w+):\s?(.+?)(?=\s+\w+:|"?$)

或没有捕获组的情况:

\w+:\s?.+?(?=\s+\w+:|"?$)

查看演示here

<强>解释

(\w+):将匹配以冒号结尾的任何单词,并捕获单词部分。

.+?会懒惰地匹配任何字符,只要满足下一个条件就会停止匹配。

(?=\s\w+:)是一种环绕匹配,可在匹配\s\w+:时停止匹配。这对应于一个空格后跟一个以冒号结尾的单词。