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、またはSERVICENAMEではありません。
  • #が前に付いている単語は無視し、スペースも無視します。

これを支援できる正規表現の専門家はいますか?「スペースを無視する」という要件は、コード内の空白を最初に削除することで解消できます。

結果は一致するはずです:

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

2 に答える 2

5

これで済むはずです。

http://rubular.com/r/o9AjrFUq5q

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

最初の文字が #() または単語境界でないことを確認します。

最後のピリオドまですべてを取得し、その後 = 記号の前に任意のスペースを取得します。少し複雑ですが、うまくいくようです。

于 2012-09-26T16:51:30.703 に答える
0

これが古いトピックであることは承知していますが、正規表現が適していない場合に役立つ参考資料を追加したいと思います。ANTLR を使用して、tnsnames.ora 全体 (および sqlnet.ora など) を解析できます。

この文法への参照は、antlr3.orgの文法リストにあります。

于 2014-01-15T12:55:39.360 に答える