2012-09-26 21 views
3

我讀這question,我試圖做一種相反的。這張海報想要捕捉有關連接的信息,我想在所有連接名稱上匹配。考慮這個文件:用正則表達式解析tnsnames.ora中只得到名字

SOMESCHEMA = 
    (DESCRIPTION = 
    (ADDRESS_LIST = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = REMOTEHOST)(PORT = 1234)) 
    ) 
    (CONNECT_DATA = 
(SERVICE_NAME = REMOTE) 
    ) 
) 
# comment 
MYSCHEMA.world = 
    (DESCRIPTION =  
(ADDRESS = (PROTOCOL = TCP)(HOST = MYHOST)(PORT = 1234))  
(CONNECT_DATA =  
(SERVER = DEDICATED)  
(SERVICE_NAME = MYSERVICE.LOCAL)  
) ) 

##comment 
##comment 
MY.OTHER.SCHEMA=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MYHOST)(PORT=1234)))(CONNECT_DATA=(SERVICE_NAME=MYSERVICE.REMOTE))) 


SOMEOTHERSCHEMA = (DESCRIPTION =  (ADDRESS_LIST =  (ADDRESS = (PROTOCOL = TCP)(HOST = LOCALHOST)(PORT = 1234)) )  (CONNECT_DATA =  (SERVICE_NAME = LOCAL) ) ) 

的RexEx規則應該足夠簡單,我只是用RegExs可怕。它應該是:

  • 匹配任何單詞(「」不打破),其後面是‘=’,不考慮空間,這不是說明,ADDRESS_LIST,地址,協議,主機,端口CONNECT_DATA或服務名稱。
  • 忽略以#開頭的單詞,再次忽略空格。

任何正則表達式的專家,可以幫助這一點?如果有幫助,可以通過先刪除代碼中的空白來消除「無視空格」要求。

結果應符合:

  • SOMESCHEMA
  • MYSCHEMA.world
  • MY.OTHER.SCHEMA
  • SOMEOTHERSCHEMA
+0

我們絕對不能忽視任何一個「(」?這將使它很容易的。 – Tadgh

+0

是的。這將是一個有效的規則。 – Paul

+0

之前他們總是有字的架構在其中 – Tadgh

回答

5

這應該做到這一點。

http://rubular.com/r/o9AjrFUq5q

^([^#()\W ][a-zA-Z.]*(?:[.][a-zA-Z]*\s?=)?) 

確保第一個字符不是#()或單詞邊界。

抓鬥一切直到最終期,然後=符號之前的可選的空間。有點複雜,但它似乎工作。

+0

我只獲得了其他的正則表達式測試儀上的第一場比賽(http://gskinner.com/RegExr/)。這是正則表達式的功能或語言(紅寶石主場迎戰C#)? – Paul

+0

我是現在在平板電腦上學,所以我不能提供更完整的答案,但我認爲這是語言之間的正則表達式風格的差異。 – Tadgh

+0

我能夠使用您的答案的變體結合一些C#代碼來獲得我所追求的。謝謝你的幫助。回到課堂上! – Paul

0

我知道這是一個老話題,但我想添加一個有用的參考,當正則表達式是不是要走的路。你可以使用ANTLR來解析整個tnsnames.ora(以及sqlnet.ora等)。

你可以找到在antlr3.org在grammar list參考,this grammar