2012-02-02 103 views
2

我用java我的程序
假設我有一個字符串,如這個匹配左括號爲相應的右括號

xx(yyzz(iijj))qq((kkll)(gghh)) 

有什麼辦法在這我可以xx(yyzz(iijj))qq((kkll)(gghh))單獨使用匹配正則表達式?

+0

這是功課嗎? – 2012-02-02 18:46:25

+0

不,你不能 – user1096188 2012-02-02 18:49:46

+1

我已經看到了它稱之爲混合公司BF ......但好運氣這一點。 BF看起來像一件苦差事。 – 2012-02-02 18:55:14

回答

4

可以這樣做遞歸使用正則表達式將嵌套括號匹配至固定級別。但是2級以上會變得相當混亂(坦率地說2)。這將匹配你的例子:

\(([^()]*+|\([^()]*+\))*\) 

一個快速的解釋:

\(    # match a '(' 
(    # open group 1 
    [^()]*+  # match any chars other than '(' and ')' 
    |    # OR 
    \([^()]*+\) # match '(...)' 
)*    # close group 1 and repeat it zero or more times 
\)    # match a '(' 

查看演示ideone.com

有正則表達式的口味,可以匹配嵌套(Perl中,.NET任意數量的,PHP),但Java不是其中之一。

但看你貼你的問題下的評論,我不是正則表達式處理這個問題,而是一個適當的解析器(無論是手工製作的一個,或產生的)。

+0

這是我第一次嘗試這樣的事情,我需要做更多的研究:) – 2012-02-02 19:00:39

+0

感謝的例子,但我會考慮你的意見後,修訂解析器:) – 2012-02-02 19:07:26

+0

@CedricMamo,好! :) – 2012-02-02 19:07:53

7

簡單的答案是否定的,有沒有一種方法只使用正則表達式來做到這一點。只需遍歷字符串並將打開的括號插入堆棧即可。當你打開封閉的圓括號時彈出。如果您嘗試彈出或完成並且堆棧不是空的,那麼它是無效的。

您還可以通過刪除「(」和lastIndex的「)」的第一個指標驗證的指數「(」小於指數「)」

+0

好的謝謝。我喜歡直接的答案。可能需要重新考慮我目前的代碼。感謝您的快速回復:) – 2012-02-02 18:55:08

+0

它完成了。實現了你描述的東西,除了我保留了一個計數器而不是堆棧。爲每個計數器增加計數器(找到併爲每個計數器遞減)。如果計數器達到0,這意味着我已經按照我在問題中描述的方式打了一場比賽。謝謝:)我會投你的答案了,但我沒有足夠的代表尚未:S – 2012-02-02 23:51:36

+0

你應該能夠標記一個答案@CedricMamo通過點擊給予好評/ downvote下面的複選標記爲接受。謝謝。 – 2012-02-03 00:04:16