2012-09-08 21 views
0

我正在尋找一種有效的方法來一般性地從字符串中提取數據,使用另一個字符串作爲模板。僞代碼:如何使用另一個字符串作爲模板從字符串中提取數據?

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' 
    } 

有在這種情況下逗號分隔符但不是所有的字符串將被分隔或將有不同的分隔符。沒有任何要解析的字符串將包含括號。這是否可能和/或明智的做正則表達式?在這種情況下速度至關重要。一如既往,您的幫助非常感謝。

+0

我得到的分隔符可以在不同的同一字符串。但模板是否與輸入字符串具有相同的「分隔符配置」? –

+0

我不認爲這是可能的,你已經指定它的方式。如果字符串可能未被分隔,那麼mystring =「abc」,mytemplate =「[x] [y]」的正確輸出是什麼?它可以是x:ab y:c或x:a y:bc。我認爲你需要更好地指定你想達到的目標。 – MikeFHay

+0

可能想看看這個在Javascript中的scanf實現的靈感:http://phpjs.org/functions/sscanf:886 – MikeFHay

回答

2

一種解決方案是在http://jsfiddle.net/CrossEye/Kxe6W/

var templatizedStringParser = function(myTemplate, myString) { 

    var names = []; 
    var parts = myTemplate.replace(/\[([^\]]+)]/g, function(str, name) { 
     names.push(name); 
     return "~"; 
    }).split("~"); 

    var parser = function(myString) { 
     var result = {}; 
     remainder = myString; 
     var i, len, index; 
     for (i = 0, len = names.length; i < len; i++) { 
      remainder = remainder.substring(parts[i].length); 
      index = remainder.indexOf(parts[i + 1]); 
      result[names[i]] = remainder.substring(0, index); 
      remainder = remainder.substring(index); 
     } 
     result[names[names.length - 1]] = remainder; 
     return result; 
    }; 

    return myString ? parser(myString) : parser; 
}; 

您可以使用它像這樣

console.log(templatizedStringParser(myTemplate, myString)); 

或本:

var parser = templatizedStringParser(myTemplate); 
console.log(parser(myString)); 

有幾乎肯定會在那裏,我做了一些克魯夫特這很匆忙。 「〜」的使用可能不適合你。如果您有邊界問題,那麼可能還有其他問題,但可能涉及許多案例。

0

這應該是工作......

//This mothod 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" 
} 
相關問題