2016-10-26 10 views
0

文字列をinside()ではないコンマで区切る正規表現を書いてみたいと思います。特定の境界内にない文字列で分割する

例:

"test,test,test".split(/.../) => var a = ["test", "test", "test"]; 
"test(123,345),test".split(/.../) => var a = ["test(123,345)", "test"]; 
"test(123,345),a(b,c)".split(/.../) => var a = ["test(123,345)", "a(b,c)"]; 
"test(cb(a,b),345),a(b(d,e,f),c),abc".split(/.../) => var a = ["test(cb(a,b),345)", "a(b(d,e,f),c)", "abc"]; 

私は、次の正規表現がありますが、私は最初の試合のコンマの後に()持っていない場合にのみ動作します:

"test,test,test".split(/,(?!.*\))/) => OK 
"test(cb(a,b),345),test,test".split(/,(?!.*\))/) => OK 
"test,test(cb(a,b),345),test".split(/,(?!.*\))/) => FAIL 
+0

おそらく '/、(?![^、] * \))/'? –

答えて

2

正規表現が適応されていませんこの種の仕事に。私はあなたが分割またはべきでないかどうかを判断するためにあなたはブラケット・ネストのレベルに従ってください、あなた自身のパーサーをロールしやすくなると思う:あなたが望むかもしれない私が不一致のブラケットを処理していませんでした

function splitTokens(var input) { 
    var tokens = []; 
    var currentToken = ""; 
    var nestingLevel = 0; 

    for (var i = 0; i < input.length; i++) { 
     var currentChar = input[i]; 
     if (currentChar === "," && nestingLevel === 0) { 
      tokens.push(currentToken); 
      currentToken=""; 
     } else { 
      currentToken+=currentChar; 
      if (currentChar === "(") { nestingLevel++; } 
      else if (currentChar === ")") { nestingLevel--; } 
     } 
    } 

    if (currentToken.length) { 
     tokens.push(currentToken); 
    } 

    return tokens; 
} 

注意、これらのケースのロジックを追加します。

+0

ありがとうございます@アロン、それは魅力のように動作します。 –

関連する問題