2010-12-03 70 views
2

我有一些字符串,如:如何捕獲括號的組用java正則表達式

(((a * b) + c) * d) 

,並希望獲得與Java正則表達式帶括號的組。我認爲這個簡單的正則表達式

Pattern p = Pattern.compile("\\((.*)\\)",Pattern.DOTALL); 

會做的工作,但它沒有。

這是什麼問題?

回答

3

您嘗試使用正則表達式定義的語言很不幸有異味,即正則表達式不適合這種類型的表達式。 (準確地說,「平衡括弧」是不是你可以使用正則表達式定義。)

不過,若你只是想找到子a * b在你的榜樣,下面的表達式應該做的:

Pattern p = Pattern.compile("\\(([^()]*)\\)"); 
Matcher m = p.matcher("(((a * b) *) + c) * d)"); 
if (m.find()) 
    System.out.println(m.group(1)); // prints "a * b" 
+0

+1 - 這絕對是非常規的。任何具有平衡圓括號的表達式的語法都是固有遞歸的,但嚴格的RE會限制您進行交替和重複。 – 2010-12-03 14:20:23

+0

我不是100%確定OP正試圖弄清楚表達式是否具有平衡括號。 – aioobe 2010-12-03 14:22:06

+0

謝謝aioobe。我顯然錯過了「常規」的事情。它當然是一個非正則表達式。 我其實想捕捉所有的組。這意味着我預計有 ((a * b)+ c)* d (a * b)+ c a * b – archangle 2010-12-03 14:36:02

1

正則表達式不擅長拾取圓括號等平衡對。沒有正則表達式,你會更好地解析字符串。

1

我相信使用RegEx處理嵌套結構幾乎是不可能的。更好地遍歷每個字符並跟蹤你有多少個開放的括號。

此外,如果您的目標是評估infix notation中的數學表達式,那麼使用shunting algorithm可能會獲得更大的成功。