1

これが私が解決しようとしてきたことです...

ajax 呼び出しからいくつかのデータを取得しました。結果データは、キーと値のデータを持つ巨大な文字列です。例えば:

"2R=OK|2M=2 行見つかりました|V1=1,2|"

jsが次のようなことをすることは可能ですか: var value = someFunction(str, param);

「V1」パラメータを検索すると、「1,2」が返されます

これをSqlサーバーで問題なく実行できましたが、jsで文字列を解析するのに苦労しています。

これまでのところ、次のような非常に初歩的な for ループでこれを行うことができます。

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);

それを関数に入れると機能しますが、より効率的な方法があるのではないかと思います。おそらく正規表現ですか?しかし、私はそれを吸う。うまくいけば、誰かが私のためにこれに光を当てることができますか?

ありがとう!

4

3 に答える 3

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);

JS フィドルのデモ

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);

JS フィドルのデモ

このアプローチでは、変数を正規表現に渡すためにnew RegExp()( を使用して正規表現リテラルを作成するのではなく) コンストラクターを使用する必要があることに注意してください。/.../

同様に、コンストラクター内で正規表現を作成するために文字列を使用しているため、エスケープが必要な文字を二重にエスケープする必要があります (最初に文字列内でエスケープし、次に作成された RegExp 内でエスケープします)。

参考文献:

于 2013-08-27T17:32:19.980 に答える
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");
  }
})();

この回答から借用した引用機能

使用例:

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"
于 2013-08-27T17:36:12.893 に答える
0

別のアプローチを次に示します。

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
于 2013-08-27T17:51:56.533 に答える