2012-09-26 18 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