拆分键:值;配对并排除匹配中的空格

时间:2014-07-05 15:53:28

标签: javascript regex string split removing-whitespace

假设我们有一个这样的字符串:' 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;
};

4 个答案:

答案 0 :(得分:1)

您可以尝试以下正则表达式来单独捕获Key,Value对

\s*(\S+)\s*:\s*([^;\s]*(?:\s*\w+))

DEMO

答案 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] + /克