1

別の文字列をテンプレートとして使用して、文字列からデータを一般的に抽出する効率的な方法を探しています。擬似コード:

var mystring = "NET,1:1,0,ipv4,192.168.1.7,255.255.255.0,192.168.1.1";
var mytemplate = "NET,[address],[lock_state],[ip_type],[ip],[netmask],[gateway]";
var result = mysteryMethod(mystring,mytemplate);
result:
    {
      address: '1:1',
      lock_state: '0',
      ip_type: 'ipv4',
      ip: '192.168.1.7',
      netmask: '255.255.255.0',
      gateway: '192.168.1.1'
    }

この場合、コンマ区切り文字がありますが、すべての文字列が区切られるわけではなく、異なる区切り文字が使用されるわけでもありません。解析される文字列にはブラケットが含まれません。これは正規表現で可能であり、および/または賢明ですか?この場合、速度が非常に重要です。いつものように、あなたの助けは大歓迎です。

4

2 に答える 2

1
//This method obtains each lable in the template string
function getLables(patt, templateStr) {
    var i = 0;
    var tmp = patt.exec(templateStr);
    var lables = new Array();
    while(tmp) {
        lables[i] = new String(tmp).replace("[", "").replace("]", "");
        tmp = patt.exec(templateStr);
        ++i;
    }
    return lables;
}

function extract(_inputStr, _template) {
    //Supposing the start string in template is NET
    var startStr = "NET";
    var inputStr = _inputStr.replace(startStr, "");
    var template = "";

    //You can add a control on the correctness of the template
    if(_template.indexOf(startStr) != 0) {
        return false;
        //you could use a throw clausole, in order to use exceptions
    } else {
        template = _template.replace(startStr, "");
    }

    var patt = /\[[a-z | _]+\]/ig; //Pattern to recognize each [lable]
    var delim = template.replace(patt, "[]").split("[]"); //Delimiter list
    var lable = getLables(patt, template); //Lables list
    var result = new Object();

    var endIndex;
    for(var i=0; i<lable.length; ++i) {
        inputStr = inputStr.replace(delim[i], "");
        endIndex = inputStr.indexOf(delim[i+1]);

        if( (i+1) == lable.length ) {
            result[lable[i]] = inputStr.substring(0, inputStr.length);
        } else {
            result[lable[i]] = inputStr.substring(0, endIndex)
            inputStr = inputStr.replace(result[lable[i]], "");
        }

    }

    return result;
}

この例では:

var template = "NET???[one]/[two]";
var inputStr = "NET???test/8";

JSON.stringify(extract(inputStr, template));

結果は次のとおりです。

{
    "one":"test",
    "two":"8"
}
于 2012-09-09T13:48:40.537 に答える