2012-02-09 65 views
2

我在javascript中有以下問題:我想刪除字符串中不匹配的圓括號,因此沒有嵌套。javascript - 括號正則表達式/解析器

我已經從字符串中刪除了除[^a-z\-()]之外的所有內容。 只有()應該被刪除。 我認爲這描述了我想要發生的事情。

  1. 如果在一開始未開封)然後取出)
  2. 如果未關閉(末尾,則追加)字符串
  3. 對於每個(,展望一下未來)
  4. 前刪除所有 (
  5. 對於每個),不應再有)直到發生下一個(
  6. 刪除任何包含0或1個字符的(),雖然這可以單獨完成。

所以a)b()(c)(de)f(g(h)i)j)(k成爲abc(de)f(gh)ijk

a(bc成爲a(bc)

我也想有隻封閉在保持支架獨特的字符,但是這同樣可在以後

所以aa(bb變得aa(bb)然後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 2012-02-09 13:56:32