我用java我的程序
假設我有一個字符串,如這個匹配左括號爲相應的右括號
xx(yyzz(iijj))qq((kkll)(gghh))
有什麼辦法在這我可以xx(yyzz(iijj))
和qq((kkll)(gghh))
單獨使用匹配正則表達式?
我用java我的程序
假設我有一個字符串,如這個匹配左括號爲相應的右括號
xx(yyzz(iijj))qq((kkll)(gghh))
有什麼辦法在這我可以xx(yyzz(iijj))
和qq((kkll)(gghh))
單獨使用匹配正則表達式?
您可以這樣做遞歸使用正則表達式將嵌套括號匹配至固定級別。但是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不是其中之一。
但看你貼你的問題下的評論,我不是正則表達式處理這個問題,而是一個適當的解析器(無論是手工製作的一個,或產生的)。
這是我第一次嘗試這樣的事情,我需要做更多的研究:) – 2012-02-02 19:00:39
感謝的例子,但我會考慮你的意見後,修訂解析器:) – 2012-02-02 19:07:26
@CedricMamo,好! :) – 2012-02-02 19:07:53
簡單的答案是否定的,有沒有一種方法只使用正則表達式來做到這一點。只需遍歷字符串並將打開的括號插入堆棧即可。當你打開封閉的圓括號時彈出。如果您嘗試彈出或完成並且堆棧不是空的,那麼它是無效的。
您還可以通過刪除「(」和lastIndex的「)」的第一個指標驗證的指數「(」小於指數「)」
好的謝謝。我喜歡直接的答案。可能需要重新考慮我目前的代碼。感謝您的快速回復:) – 2012-02-02 18:55:08
它完成了。實現了你描述的東西,除了我保留了一個計數器而不是堆棧。爲每個計數器增加計數器(找到併爲每個計數器遞減)。如果計數器達到0,這意味着我已經按照我在問題中描述的方式打了一場比賽。謝謝:)我會投你的答案了,但我沒有足夠的代表尚未:S – 2012-02-02 23:51:36
你應該能夠標記一個答案@CedricMamo通過點擊給予好評/ downvote下面的複選標記爲接受。謝謝。 – 2012-02-03 00:04:16
這是功課嗎? – 2012-02-02 18:46:25
不,你不能 – user1096188 2012-02-02 18:49:46
我已經看到了它稱之爲混合公司BF ......但好運氣這一點。 BF看起來像一件苦差事。 – 2012-02-02 18:55:14