假设我们有一个这样的字符串:' key1 : value1 ; key2 : value2 value3 '
我们希望将其转换为javasript - object
。我们可以匹配不是分隔符(:;
)的东西并捕获这些匹配。太棒了,用简单的正则表达式完成了这项工作:
/([^:]+):?([^;]+);?/g
我当前RegExp
的问题是,它还包含结果中的空格。所以上面的字符串会产生这样的结果:
{
" key1 ": " value1 ",
" key2 ": " value2 value3 "
}
不是我们想要的......所以我已将RegExp
改为:
/\s*([^:]+)\s*:?\s*([^;]+);?\s*/g
Arr,该死的!字符集[^:]+
匹配任何不是冒号的内容(也是空格)。会产生这样的结果:
{
"key1 ": "value1 ",
"key2 ": "value2 value3 "
}
任何想法我们如何只捕获key
s / value
s,而不包括匹配中的空格。所以我们的结果看起来像这样:
{
"key1": "value1",
"key2": "value2 value3"
}
顺便说一句,这就是完整的解析函数的样子:
var parseAttributes = function (attribute) {
var REGEX_SPLIT_PAIRS = /;?([^:]+):?([^;]+);?/g;
var attributes = {};
var match;
while (match = REGEX_SPLIT_PAIRS.exec(pairs)) {
attributes[match[1]] = match[2];
}
return attributes;
};
修改
另一种方法是将属性 -string分解为成对块。但是,我想到了一个纯粹的RegExp解决方案,没有trim
:
var parseAttributes = function (attribute) {
var attributes = {};
attribute.split(';').forEach(function (pair) {
var pairs = pair.split(':');
if (pairs && pairs[0] && pairs[1]) {
attributes[pairs[0].trim()] = pairs[1].trim();
}
});
return attributes;
};
答案 0 :(得分:1)
答案 1 :(得分:1)
您能保证每个条目都与模型相匹配吗?#34; key:value;",每个条目都有一个":"和";"分隔符?如果是这样,这可能有效:
/\s*([^:]+?)\s*:\s*([^;]+?)\s*;/g
答案 2 :(得分:0)
/ \ s *([^:] +)\ s *:?\ s *([^;] +);?\ s * / g匹配空格,因为第一个匹配是贪婪的;停止这只是添加一个?到了比赛。 我认为/ \ s *([^:] +?)\ s *:?\ s *([^;] +?)\ s *;?\ s * / g会做你想要的。
答案 3 :(得分:0)
我不知道它是否会起作用,但是, 你试过吗? / [A-Z0-9] + /克