2015-10-21 197 views
2

分解字符串時出現問題。使用正則表達式分解帶括號的字符串

問題:

我想分解的字符串是這樣的:

(01)123456789(11)060606(17)121212(21)1321asdfght(10)aaabbb

,並返回一個像這樣的對象:

Object { 
     identifier01: "123456789", 
     identifier11: "060606", 
     identifier17: "121212", 
     identifier21: "1321asdfght", 
     identifier10: "aaabbb" 
} 

規則:
identifier01有總是14個數字字符
identifier11始終6個數字字符
identifier17始終6個數字字符
identifier21始終爲1至20個字母數字字符
identifier10始終爲1至20個字母數字字符

的問題是identifier21和identifier10沒有固定的字符長度(從1到20個字符不等)。更重要的是,只有identifier01總是在開頭的標識符和其餘的可以有不同的順序,讓我們說:

(01)123456789(21)111122233344(10)abcdeed(11)050505(17)060606

,甚至是特定的標識符可以根本不存在:

(01)123456789(21)111122233344(17)060606

我的方法:

parseStringToAnObject: function (value) { 
      var regs = [ 
       ["(01) ", /\([^)]*01\)([0-9]{14})/], 
       ["(10) ", /\([^)]*10\)([0-9a-zA-Z]{1,20})/], 
       ["(11) ", /\([^)]*11\)([0-9]{6})/], 
       ["(17) ", /\([^)]*17\)([0-9]{6})/], 
       ["(21) ", /\([^)]*21\)([0-9a-zA-Z]{1,20})/] 
      ]; 

      var tempObj = {}; 

      while (value.length > 0) { 
       var ok = false; 
       for (var i = 0; i < regs.length; i++) { 
        var match = value.match(regs[i][1]); 
        console.log(match); 
        if (match) { 
         ok = true; 
         switch (match[0].slice(0, 4)) { 
          case "(01)": 
           tempObj.identifier01 = match[1]; 
           break; 
          case "(21)": 
           tempObj.identifier21 = match[1]; 
           break; 
          case "(11)": 
           tempObj.identifier11 = match[1]; 
           break; 
          case "(17)": 
           tempObj.identifier17 = match[1]; 
           break; 
          case "(10)": 
           tempObj.identifier10 = match[1]; 
           break; 
         } 

         value = value.slice(match[0].length); 
         break; 
        } else { 
         console.log("Regex error"); 
        } 
       } 
       if (!ok) { 
        return false; 
       } 
      } 
      console.log(tempObj); 
      return tempObj; 
} 

結果:

我的函數返回一個適當的數據,但只有當我不鍵入可變數量的字符的標識符。當我輸入例如

(01)123456789(21)abder123(17)121212

(01)123456789(10)123aaaaabbbddd(21)qwerty

(01)123456789(17)060606(10)aabbcc121212(11)030303

它總是返回我

您能否提出一個更好更精細的方法?
感謝您提前給出所有答案和解決方案!

回答

1

以下是我會做:

var s = "(01)123456789(11)060606(17)121212(21)1321asdfght(10)aaabbb", 
 
    r = {}; 
 

 
s.replace(/\((\d\d)\)([^()]+)/g, function(m,p,d){ r['identifier'+p]=d;return '';}); 
 
    
 
console.log(r);

1

我甚至不會使用正則表達式:

var final = {}; 
var a = "(01)123456789(11)060606(17)121212(21)1321asdfght(10)aaabbb"; 
a.split("(").slice(1).sort().map(function(i) { 
    var pieces = i.split(')'); 
    final["identifier" + pieces[0]] = pieces[1]; 
}); 
console.log(final); 

//Object {identifier01: "123456789", identifier10: "aaabbb", identifier11: "060606", identifier17: "121212", identifier21: "1321asdfght"} 
相關問題