这是我一直试图解决的问题......
我们从ajax调用获得了一些数据,结果数据在其他东西之间是一个巨大的字符串和key:value数据。例如:
“2R = OK | 2M =找到2行| V1 = 1,2 |”
js可以执行以下操作: var value = someFunction(str,param);
所以如果我搜索“V1”参数,它将返回“1,2”
我在Sql服务器上运行没有出汗,但我正在努力用js来解析字符串。
到目前为止,我能够通过这样一个非常简陋的循环来做到这一点:
var str = "2R=OK|2M=2 row(s) found|V1=1,2|";
var param = "V1";
var arr = str.split("|");
var i = 0;
var value = "";
for(i = 0; i<arr.length; ++i){
if( arr[i].indexOf(param)>-1 ){
value = arr[i].split("=")[1];
}
}
console.log(value);
如果我把它放到一个函数中它可以工作,但我想知道是否有更有效的方法来做,也许一些正则表达式?但我很沮丧。希望有人可以为我发光吗?
谢谢!
答案 0 :(得分:2)
这似乎适用于您的具体用例:
function getValueByKey(haystack, needle) {
if (!haystack || !needle) {
return false;
}
else {
var re = new RegExp(needle + '=(.+)');
return haystack.match(re)[1];
}
}
var str = "2R=OK|2M=2 row(s) found|V1=1,2|",
test = getValueByKey(str, 'V1');
console.log(test);
并且,要在搜索中包含分隔符(以防止somethingElseV1
匹配V1
):
function getValueByKey(haystack, needle, separator) {
if (!haystack || !needle) {
return false;
}
else {
var re = new RegExp('\\' + separator + needle + '=(.+)\\' + separator);
return haystack.match(re)[1];
}
}
var str = "2R=OK|2M=2 row(s) found|V1=1,2|",
test = getValueByKey(str, 'V1', '|');
console.log(test);
请注意,此方法确实需要使用new RegExp()
构造函数(而不是使用/.../
创建正则表达式文字),以便将变量传递到正则表达式中。
同样,因为我们使用字符串在构造函数中创建正则表达式,所以我们需要双转义需要转义的字符(首先在字符串中转义然后在创建的RegExp中转义)。 / p>
参考文献:
答案 1 :(得分:1)
这应该对你有用,并且它的分隔符是可配置的(如果你想用不同的分隔符解析一个类似的字符串,你可以直接将分隔符作为参数传递):
var parseKeyValue = (function(){
return function(str, search, keyDelim, valueDelim){
keyDelim = quote(keyDelim || '|');
valueDelim = quote(valueDelim || '=');
var regexp = new RegExp('(?:^|' + keyDelim + ')' + quote(search) + valueDelim + '(.*?)(?:' + keyDelim + '|$)');
var result = regexp.exec(str);
if(result && result.length > 1)
return result[1];
};
function quote(str){
return (str+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
}
})();
Quote function borrowed form this answer
用法示例:
var str = "2R=OK|2M=2 row(s) found|V1=1,2|";
var param = "V1";
parseKeyValue(str, param); // "1,2"
var str = "2R=OK&2M=2 row(s) found&V1=1,2";
var param = "2R";
parseKeyValue(str, param, '&'); // "OK"
var str =
"2R=>OK\n\
2M->2 row(s) found\n\
V1->1,2";
var param = "2M";
parseKeyValue(str, param, '\n', '->'); // "2 row(s) found"
答案 2 :(得分:0)
Here是另一种方法:
HTML:
<div id="2R"></div>
<div id="2M"></div>
<div id="V1"></div>
使用Javascript:
function createDictionary(input) {
var splittedInput = input.split(/[=|]/),
kvpCount = Math.floor(splittedInput.length / 2),
i, key, value,
dictionary = {};
for (i = 0; i < kvpCount; i += 1) {
key = splittedInput[i * 2];
value = splittedInput[i * 2 + 1];
dictionary[key] = value;
}
return dictionary;
}
var input = "2R=OK|2M=2 row(s) found|V1=1,2|",
dictionary = createDictionary(input),
div2R = document.getElementById("2R"),
div2M = document.getElementById("2M"),
divV1 = document.getElementById("V1");
div2R.innerHTML = dictionary["2R"];
div2M.innerHTML = dictionary["2M"];
divV1.innerHTML = dictionary["V1"];
结果:
OK
2 row(s) found
1,2