3

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

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 专家?如果有帮助的话,可以通过首先删除代码中的空格来消除“忽略空格”的要求。

结果应该匹配:

  • 系统架构
  • MYSCHEMA.world
  • 我的其他模式
  • 其他模式
4

2 回答 2

5

这个应该可以的。

http://rubular.com/r/o9AjrFUq5q

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

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

抓取最后一段之前的所有内容,然后在 = 符号之前添加一个可选空格。有点令人费解,但它似乎工作。

于 2012-09-26T16:51:30.703 回答
0

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

您可以在 antlr3.org的语法列表中找到对该语法的参考

于 2014-01-15T12:55:39.360 回答