2013-03-31 192 views
12

我想刪除使用Java正則表達式的括號,但我遇到了錯誤No group 1請看我的代碼並幫助我。使用java正則表達式從字符串中刪除括號

public String find_parenthesis(String Expr){ 
     String s; 
     String ss; 
     Pattern p = Pattern.compile("\\(.+?\\)"); 
     Matcher m = p.matcher(Expr); 
     if(m.find()){ 
      s = m.group(1); 
      ss = "("+s+")"; 
      Expr = Expr.replaceAll(ss, s); 
      return find_parenthesis(Expr); 
     } 
     else 
      return Expr; 
    } 

,這是我的主:

public static void main(String args[]){ 
    Calculator c1 = new Calculator(); 
    String s = "(4+5)+6"; 
    System.out.println(s); 
    s = c1.find_parenthesis(s); 
    System.out.println(s); 
} 
+0

爲了捕獲一個組,你需要在你的正則表達式中有一對未轉義的圓括號。然而,假設你做了這個改變,剩下的代碼只是重新放回括號,不是嗎? –

+0

爲什麼你需要這個正則表達式? –

+0

@KennethK。我需要它來進行公式分析 – Ehsan

回答

1

你不能用一個正則表達式做到這一點的。它不會刪除與匹配的括號,即第一個左側和第一個右側,然後您將無法從表達式中獲得正確的結果。表達式需要一個解析器。查看遞歸下降ezpresssion解析器,Dijkstra分流碼算法等。

+0

我的括號不是嵌套的,但是謝謝你的回答 – Ehsan

+0

@Ehsan如果你完全控制了輸入,你必須能夠斷言,我不明白你爲什麼需要表達分析器。在任何情況下,我的評論站在。你需要一個表達式解析器。臨時方法不起作用。你這樣做是錯誤的。當你處理操作符優先級時,問題會重新出現。做對了。真的沒有其他選擇。 – EJP

+0

是的,無論如何,你的評論解析我的方式是站立,我從來沒有說過在公式解析我的方式是正確的,但只有我面臨正則表達式的錯誤,我問問題解決它 – Ehsan

2

你得到的錯誤是因爲你的正則表達式沒有任何組,但我建議你使用這個更簡單,行的方式:

expr = expr.replaceAll("\\((.+?)\\)", "$1"); 
23

最簡單的方法是隻從字符串中刪除所有括號,不管他們是否是平衡與否。

String replaced = "(4+5)+6".replaceAll("[()]", ""); 

正確處理平衡需要解析(或真正難看的RE僅匹配到有限的深度,或「聰明」反覆正則表達式取代)。在大多數情況下,這種複雜性是過度的;最簡單的事情可能會起作用。

9

你想要的是這個:s = s.replaceAll("[()]","");

更多關於正則表達式,請訪問:regex tutorial

1

正則表達式定義了一個由任何空格字符組成的字符類(\ s,它被轉義爲\ s因爲我們傳入一個字符串),一個破折號(由於破折號意味着在字符類)和括號。試試它的工作代碼。

phoneNumber.replaceAll("[\\s\\-()]", ""); 
-1

我知道我在這裏很晚。但是,以防萬一你還在尋找更好的答案。如果您在使用本

String s = "(4+5)+6"; 
s=s.replaceAll("\\(", "").replaceAll("\\)",""); 

s=s.replaceAll("()", ""); 

你指示的代碼,如果你想從一個字符串中刪除打開和關閉括號,你可以用這樣一個非常簡單的方法尋找(),這是不存在於你的字符串。相反,您應該嘗試單獨刪除括號。

爲了詳細解釋,請考慮下面的代碼:

String s = "(4+5)+6"; 
String s1=s.replaceAll("\\(", "").replaceAll("\\)",""); 
System.out.println(s1); 
String s2 = s.replaceAll("()", ""); 
System.out.println(s2); 

此代碼的輸出將是:

4 + 5 + 6

(4 + 5)+ 6

另外,僅當您需要時才使用。在其他情況下,replace工作得很好。請看下圖:

String s = "(4+5)+6"; 
String s1=s.replace("(", "").replace(")",""); 

輸出:

4 + 5 + 6

希望這有助於!

相關問題