2009-11-21 92 views
0

嗨,纔有可能正確地劃分功能屬性,使用正則表達式? 我想,在分割一個逗號分隔列表中的所有屬性的表達。但是屬性本身可能是一個數組或對象或東西,也可以包含逗號:劃分功能屬性

例如:

'string1','string2',sum(1,5,8), ["item1","item2","item3"], "string3" , {a:"text",b:"text2"} 

這應該被分割爲:

'string1' 
'string2' 
sum(1,5,8) 
["item1","item2","item3"] 
"string3" 
{a:"text",b:"text2"} 

這樣的表達應該分頭所有逗號,但不包含由(),{}或[]包圍的逗號。

我試圖這樣在AS3 BTW 這裏是一些代碼,將拆分所有的逗號(這是ofcourse不是我想要的):

var attr:String = "'string1','string2',sum(1,5,8), ['item1','item2','item3'], 'string3' , {a:'text',b:'text2'}"; 
var result:Array = attr.match(/([^,]+),/g); 
trace(attr); 
for(var a:int=0;a<result.length;a++){ 
    trace(a,result[a]); 
} 

這裏是允許嵌套圓括號的表達式,但不是別人......

/([^,]+\([^\)]+\)|[^,]+),*/g 
+0

如果你想允許*嵌套*括號,括號或中括號,那麼這相當於解析HTML/XML與正則表達式只是,你正在使用錯誤的工具。 – 2009-11-21 21:00:09

+0

你是什麼意思錯誤的工具? 我應該使用什麼工具? 不正則表達式呢? – Aaike

+0

正則表達式不足以支持嵌套。您需要更強大的代表下推自動機的東西。 – Suppressingfire

回答

1

我創建了一個小例子如何解決這樣的問題,只有在你輸入的測試,因此它可能包含可怕的錯誤。它只考慮括號而不考慮(捲曲)大括號,但可以輕鬆添加。

的基本想法是,你遍歷輸入的文字,並將其添加到當前的令牌,如果他們不分隔字符,並遇到一個分離器,當按下當前令牌到結果陣列。你必須添加一個堆棧,將跟蹤你是如何「深」嵌套來確定一個逗號的是一個令牌的分離或部分。

對於任何比這更復雜的問題,你可能會更好地使用'真正'的解析器(也可能是一個解析器生成器),但在這種情況下,我認爲你可以使用一些自定義代碼。

正如你可以看到快速解析這樣的代碼變得相當費解/調試。在實際情況下,我建議添加更多評論,但也是一批很好的測試來解釋您的預期行爲。

package { 
    import flash.display.Sprite; 

    public class parser extends Sprite 
    { 
     public function parser() 
     { 
      var input:String = "'string1','string2',sum(1,5,8), [\"item1\",\"item2\",\"item3\"], \"string3\" , {a:\"text\",b:\"text2\"}" 


      var result:Array = parseInput(input); 
      for each (var item:String in result) 
      { 
       trace(item); 
      } 
     } 

     // this function only takes into account the '(' and ')' - adding the others is similar. 
     private function parseInput(input:String):Array 
     { 
      var result:Array = []; 
      trace("parsing: " + input); 

      var token:String = ""; 
      var parenthesesStack:Array = []; 
      var currentChar:String; 
      for (var i:int = 0; i < input.length; i++) 
      { 
       currentChar = input.charAt(i) 
       switch (currentChar) 
       { 
        case "(": 
        parenthesesStack.push("("); 
        break; 

        case ")": 
        if (parenthesesStack.pop() != "(") 
        { 
         throw new Error("Parse error at index " + i); 
        } 
        break; 

        case ",": 
        if (parenthesesStack.length == 0) 
        { 
         result.push(token); 
         token = ""; 
        } 
        break; 
       } 
          // add character to the token if it is not a separating comma 
       if (currentChar != "," || parenthesesStack.length != 0) 
       { 
        token = token + currentChar; 
       } 
      } 
      // add the last token 
      if (token != "") 
      { 
       result.push(token); 
      } 

      return result; 
     } 
    } 
} 
+0

很漂亮,我addjusted你編寫一個位與各種支架的工作,同時還支持newsted單引號和雙引號現在,甜;) 我已經能夠解析這個 VAR輸入:字符串=「」字符串1,字符串2,字符串2,字符串2,字符串2,字符串2,字符串2,sum(1,5,8),[\「item1 \」,\「item2 \ ,\「item3 \」],\「string3 \」,{a:\「text \」,b:\「text2 \」}「 這就足夠了:) – Aaike