我有以下示例字符串:
"msg=Hello World! param1=42 param2=abcd efgh"
我希望将其拆分为数组:
['msg', 'Hello World!', 'param1', '42', 'param2', 'abcd efgh']`
我尝试使用以下.split(/=/);
,但这并不能解释空白。我怎么能拆分字符串来产生那个数组呢?
答案 0 :(得分:3)
您可以使用此前瞻性正则表达式并抓取捕获组#1和组#2:
/(\w+)=(.+?)(?= \w+=|$)/gm
<强>代码:强>
var re = /(\w+)=(.+?)(?= \w+=|$)/gm;
var str = 'msg=Hello World! param1=42 param2=abcd efgh';
var m;
var result=[];
while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex)
re.lastIndex++;
result.push(m[1]);
result.push(m[2]);
}
document.write("<pre>" + result + "</pre>");
&#13;
<强>输出:强>
["msg", "Hello World!", "param1", "42", "param2", "abcd efgh"]
答案 1 :(得分:1)
您可以将此模式与RegExp.prototype.exec
方法一起使用:
/([^=\s]+)=([^=\s]*(?:\s+[^=\s]+)*)(?!\S)/g
# ^ ^ ^ ^---- ensures that a whitespace or the end of
# | | | the string follows
# | | '-------------------- eventual parts of the value after
# | | whitespaces
# +---------+--------------------------- all characters that aren't whitespaces
# | '- optional to allow or equal signs
# | empty values
# '- at least one for the key
此模式避免了最终的尾随空格,即使值为空也会成功。
答案 2 :(得分:0)
使用String.match
和Array.concat
函数的简短替代解决方案:
var str = "msg=Hello World! param1=42 param2=abcd efgh", splitted = [];
str.match(/\w+?=[^=]+(?!\w+=)(\s|$)/gi).forEach(function(v){
splitted = splitted.concat(v.trim().split("="));
});
console.log(splitted); // ["msg", "Hello World!", "param1", "42", "param2", "abcd efgh"]