2011-03-22 102 views
2

OK,正則表達式匹配嵌套的括號

我不知道是否有可能寫這個正則表達式,所以我要通過askign幫忙開始 - 到目前爲止,我還沒有成功。

源串:

,convert(varchar(8000), lt.text) as reason 

所需的匹配:

convert(varchar(8000), lt.text) 

假設

  • 語句用逗號開始(外括號的)
  • 狀態將與結束「作爲「

這是正則表達式我開始有:

\(.+\) 

謝謝以下的正則表達式

+0

什麼是你的平臺? .NET正則表達式有一個「平衡分組」的結構,可以讓你做到這一點(儘管如果你擔心這些,你仍然需要處理逃脫的parens,在一個單獨的通行證中)。 – harpo 2011-03-22 16:37:31

+0

JAVA - 我認爲這是被限制的parens殺死我。我似乎記得這並不容易,甚至可能 - 但我沒有寫出一百萬年的正則表達式。 – akaphenom 2011-03-22 16:40:47

+0

「純粹的」正則表達式是不可能的,因爲很多人會告訴你。但我已經使用了正則表達式擴展只是爲了這個目的,這很好。 – harpo 2011-03-22 16:50:24

回答

1

Bar Kiers - 是正確的,無法應付「與任意數量的嵌套」,是我記憶爲什麼和爲什麼我無法完成我想要的原因的根本原因。

HACK ALERT:我通過抓取最內側的實例,並用一個佔位符代替它,然後遞歸處理,直到沒有更多的匹配解決......

+0

是否可以發佈你的功能?我意識到這是事實發生兩年後。 – stites 2013-10-21 18:15:18

+0

對不起,我早已經過那個組織。我相信我創建了一個遞歸函數(我不需要擔心調用堆棧),在那裏我匹配內部的parens,然後使用匹配的結果作爲函數的返回值,我用它來形成一個新的正則表達式這是類似的表達='('+ matchFromInnerCall +')' – akaphenom 2013-10-29 20:24:23

+0

我很抱歉回頭我應該發佈了一個解決方案 - 但這是一個主要的黑客(如果我記得正確)。 – akaphenom 2013-10-29 20:25:13

0

用途:

^\(? <小鬼> [\ S \ S] *?)作爲

0
^,(.+\)) as [a-z]+$ 

我包括 「原因」 與[A-Z] +。

我建議你使用RightToLeft選項,如果你有它。它會加快正則表達式。如果您的語言需要,請記住要逃脫\

0

我在這裏假設PCRE語法。如果你能保證這兩個形象「爲」不要在括號內顯示出來,這樣的事情應該工作:

{,(.*) as } 

如果你不能保證「爲」不會在括號顯示,您需要定義一些將會遇到的其他條件。例如,如果線路經過「爲」永遠結束,像這樣的工作:

{,(.*) as \S+$} 

或者你可以使用一個真正的解析器,它可以保持不同情境下(括號的數量)。