2012-02-09 16 views
2

私はjavascriptで次のような問題があります。ネスティングがないように、文字列の不一致括弧を削除したいと思います。javascript - 括弧regexp/parser

文字列から[^a-z\-()]以外はすべて削除しました。 ()のみ削除してください。 これは私が何をしたいのかを説明していると思います。

  1. 開始時に未開封)はその後、次の)に先に見て、その前にすべての(を削除し、各(について文字列
  2. )を追加最後に閉じられていない(場合)
  3. を削除した場合
  4. )については、次の(が発生するまでは、)はありません。
  5. 0または1文字を囲んでいる()をすべて削除します(これは別途行うこともできます)。

のでa)b()(c)(de)f(g(h)i)j)(kabc(de)f(gh)ijk

a(bcになり、私も残る括弧で囲まれた唯一のユニークな文字を持っているしたいのですが、再び、これは後で

行うことができますので、aa(bbaa(bb)なりa(bc)

なりaa(b)次にaab

これを行うには正規表現が最適ですか?

答えて

0

あなたはルール#3 &#5を強制するために正規表現を使用することができますが、技術的には可能であるが、他はちょうど困難です。コードは、文字のストリームを処理したり、文字の配列であるかのように文字列を繰り返し処理したりする方が簡単です。あなたはあなたがいる状態を追跡するだけです...

正規表現は素晴らしいですが、それはいつも最高のツールではありません。

0

次の例のように、パーサーが必要になるだろう。そのようなことがうまくいく

function gets(s, depth) { 
    var out = ''; 

    while (s.length) { 
     var c = s.shift(); 
     if (c == '(') { 
      var p = gets(s, depth + 1); 
      if (!depth && p.length > 1) 
       p = '(' + p + ')' 
      out += p; 
     } else if (c == ')') { 
      if (depth) 
       return out; 
     } else { 
      out += c 
     } 
    } 
    return out; 
} 


str = "So a)b()(c)(de)f(g(h)i)j)(k" 
result = gets(str.split(""), 0) 
+0

おかげで、。私はこれが正規表現エンジンが内部的に何とかしていることだと思います。テストに失敗した場合は、自分で修正することができます... – user1199677