我有一些字符串,如:如何捕獲括號的組用java正則表達式
(((a * b) + c) * d)
,並希望獲得與Java正則表達式帶括號的組。我認爲這個簡單的正則表達式
Pattern p = Pattern.compile("\\((.*)\\)",Pattern.DOTALL);
會做的工作,但它沒有。
這是什麼問題?
我有一些字符串,如:如何捕獲括號的組用java正則表達式
(((a * b) + c) * d)
,並希望獲得與Java正則表達式帶括號的組。我認爲這個簡單的正則表達式
Pattern p = Pattern.compile("\\((.*)\\)",Pattern.DOTALL);
會做的工作,但它沒有。
這是什麼問題?
您嘗試使用正則表達式定義的語言很不幸有異味,即正則表達式不適合這種類型的表達式。 (準確地說,「平衡括弧」是不是你可以使用正則表達式定義。)
不過,若你只是想找到子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"
正則表達式不擅長拾取圓括號等平衡對。沒有正則表達式,你會更好地解析字符串。
我相信使用RegEx處理嵌套結構幾乎是不可能的。更好地遍歷每個字符並跟蹤你有多少個開放的括號。
此外,如果您的目標是評估infix notation中的數學表達式,那麼使用shunting algorithm可能會獲得更大的成功。
+1 - 這絕對是非常規的。任何具有平衡圓括號的表達式的語法都是固有遞歸的,但嚴格的RE會限制您進行交替和重複。 – 2010-12-03 14:20:23
我不是100%確定OP正試圖弄清楚表達式是否具有平衡括號。 – aioobe 2010-12-03 14:22:06
謝謝aioobe。我顯然錯過了「常規」的事情。它當然是一個非正則表達式。 我其實想捕捉所有的組。這意味着我預計有 ((a * b)+ c)* d (a * b)+ c a * b – archangle 2010-12-03 14:36:02