用Regex和JS迭代一个字符串

时间:2015-01-20 21:18:25

标签: javascript regex key-value

我有一组结构化数据到字符串中,我需要通过Javascript中的常规表达式迭代它。

这是数据的一个例子:

|KEY1|VALUE 1 |KEY2| VALUE 2 |KEY3| OTHER VALUE WITH ANY CHARACTER LIKE SPACES, |PIPES| AND WHAT YOU WANT |KEY4| VALUE4

我需要解析它们并创建一个结构化对象(或数组),如下所示:

myObject.KEY1 = "VALUE 1"
myObject.KEY2 = "VALUE 2"
myObject.KEY3 = "OTHER VALUE WITH ANY CHARACTER LIKE SPACES, AND WHAT YOU WANT"
myObject.KEY4 = "VALUE4"

我已经获得了那个简单的正则表达式的密钥:[|](.+?)[|]但我不知道如何遍历它们以及各自的值。

4 个答案:

答案 0 :(得分:2)

我将假设一个键由表达式\|KEY[0-9]+\|定义,因为这是包含|KEY1||KEY4|同时排除|PIPES|的最简单方法。

如果您的目标是使用循环和正则表达式匹配,而不是单个复杂的正则表达式或使用indexOf()等函数进行实际解析,那么可以使用负前瞻来完成。< / p>

var x = "|KEY1|VALUE 1 |KEY2| VALUE 2 |KEY3| OTHER VALUE WITH ANY CHARACTER LIKE SPACES, |PIPES| AND WHAT YOU WANT |KEY4| VALUE4";

var map = {};

while(x.length > 0) {
    var key = x.match(/\|KEY[0-9]+\|/)[0];
    x = x.substr(key.length);
    var value = x.match(/(.(?!\|KEY[0-9]+\|))*/)[0];
    x = x.substr(value.length);
    map[key] = value;
}

alert(JSON.stringify(map, null, 4));

http://jsfiddle.net/eyL7yhwr/

答案 1 :(得分:2)

这样就可以了。

&#13;
&#13;
//using regex
var keyString = "|KEY1|VALUE 1 |KEY2| VALUE 2 |KEY3| OTHER VALUE WITH ANY CHARACTER LIKE SPACES, |PIPES| AND WHAT YOU WANT |KEY4| VALUE4"
var cases = keyString.match(/[^|]+/g)
var myObject = {};
if (cases.length > 0)
  {
     for (var i = 0; i < cases.length; i += 2)
     {
       myObject[cases[i].toString()] = cases[i+1].trim();
     }
  }
  
  document.write(JSON.stringify(myObject));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以这样做:

&#13;
&#13;
var s = "|KEY1|VALUE 1 |KEY2| VALUE 2 |KEY3| OTHER VALUE WITH ANY CHARACTER LIKE SPACES, |PIPES| AND WHAT YOU WANT |KEY4| VALUE4";

s.match(/\|(KEY\d+)\|.*?(?=\|KEY\d|$)/g).reduce(function (res, v) { 
  var match = v.match(/(KEY\d+)\|(.*?)\s*$/);
  res[match[1]] = match[2];
  return res;
}, {})
&#13;
&#13;
&#13;

另一种解决方案更容易:

&#13;
&#13;
var s = "|KEY1|VALUE 1 |KEY2| VALUE 2 |KEY3| OTHER VALUE WITH ANY CHARACTER LIKE SPACES, |PIPES| AND WHAT YOU WANT |KEY4| VALUE4";

var v, res = {}, match = s.match(/\s*\|KEY\d+\|\s*|.+?(?=\s*\|KEY\d|$)/g);
while(v = match.shift()) 
  res[v.replace(/^[\s|]*|[\s|]*$/g, '')] = match.shift();
&#13;
&#13;
&#13;

答案 3 :(得分:0)

exec/[^|]+/g之类的东西会给你一个很好的数组。

var str = "|KEY1|VALUE 1 |KEY2| VALUE 2 |KEY3| OTHER VALUE WITH ANY CHARACTER LIKE SPACES, |PIPES| AND WHAT YOU WANT |KEY4| VALUE4";

var re = /[^|]+/g;

var arr = [];

while ((arr = re.exec(str)) !== null){
  console.log(arr[0].trim());
}

fiddle

它比其他一些正则表达式更简单,我认为它更具可读性。我还使用了trim(),如果你想在IE9之前支持,你必须使用the polyfill