regex 用正则表达式解析tnsnames.ora,只获取name

aemubtdh  于 2023-03-24  发布在  其他
关注(0)|答案(3)|浏览(135)

我正在阅读这篇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规则应该足够简单,我只是对RegEx感到恐惧。它应该是:

  • 匹配后跟“=”的任何单词(不中断“.”),忽略空格,即不是DESCRIPTION、ADDRESS_LIST、ADDRESS、PROTOCOL、HOST、PORT、CONNECT_DATA或SERVICE NAME。
  • 忽略前面有#的单词,同样忽略空格。

有任何RegExMaven可以帮助解决这个问题吗?如果有帮助的话,可以通过首先删除代码中的空格来消除“忽略空格”的要求。
结果应匹配:

  • 索梅施马
  • MYSCHEMA.world
  • MY.OTHER.SCHEMA
  • Someotherschema
v6ylcynt

v6ylcynt1#

这个应该可以了
http://rubular.com/r/o9AjrFUq5q

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

确保第一个字符不是#()或单词边界。
抓取到最后一个句点的所有内容,然后在=符号之前添加一个可选空格。有点复杂,但似乎可以工作。

nukf8bse

nukf8bse2#

我知道这是一个老主题,但我想在Regex不适用时添加一个有用的参考。您可以使用ANTLR解析整个tnsname.ora(以及sqlnet.ora等)。
您可以在www.example.com的grammar list中找到this grammar的引用antlr3.org

nfzehxib

nfzehxib3#

您可以使用oracle驱动程序jar中的oracle.net.jdbc.nl.NLParamParser来提供帮助

import oracle.net.jdbc.nl.NLParamParser;

...

try (Reader reader = new FileReader("c:/path/to/tnsnames.ora")) {
    NLParamParser parser = new NLParamParser(reader);

    System.out.println("NLPAllNames: " + Arrays.toString(parser.getNLPAllNames()));
    System.out.println("NLPListSize: " + parser.getNLPListSize());
    System.out.println("NLPAllElements: " + Arrays.toString(parser.getNLPAllElements()));

    for (String name : parser.getNLPAllNames()) {
        System.out.println(String.format("NLPListElement(%s): %s", name, parser.getNLPListElement(name)));
    }
}

相关问题