用正则表达式解析tnsnames.ora只是为了得到名字

时间:2012-09-26 15:38:13

标签: regex

我正在阅读question,我正试图做相反的事情。这张海报想要捕获有关连接的信息,我希望在所有连接名称上匹配。考虑一下这个文件:

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感到非常恐怖。它应该是:

  • 匹配任何单词(不打破“。”),后跟“=”,忽略空格,不是DESCRIPTION,ADDRESS_LIST,ADDRESS,PROTOCOL,HOST,PORT,CONNECT_DATA或SERVICE NAME。
  • 忽略以#开头的单词,再次忽略空格。

任何可以帮助解决这个问题的RegEx专家?如果有帮助,可以通过首先删除代码中的空格来消除“无视空格”要求。

结果应匹配:

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

2 个答案:

答案 0 :(得分:5)

应该这样做。

http://rubular.com/r/o9AjrFUq5q

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

确保第一个字符不是#()或字边界。

抓住所有内容到最后一段时间,然后在=符号之前选择一个可选空格。有点复杂,但它似乎工作。

答案 1 :(得分:0)

我知道这是一个古老的话题,但是当Regex无法实现时,我想添加一个有用的参考。您可以使用ANTLR来解析整个tnsnames.ora(以及sqlnet.ora等)。

您可以在antlr3.org的this grammar找到对grammar list的引用