正規表現を使用してtnsnamesファイルからいくつかの情報を取得しようとしています。私は次のパターンから始めました:
MYSCHEMA *? = *?[\W\w\S\s]*\(HOST *?= *?(?<host>\w+\s?)\)\s?\(PORT *?= *?(?<port>\d+)\s?\)[\W\w\S\s]*\(SERVICE_NAME *?= *?(?<servicename>\w+)\s?\)
これは、MYSCHEMAがファイル内の唯一のスキーマである場合は正常に機能しましたが、MYSCHEMAの後に他のスキーマがリストされている場合は、最後のスキーマと完全に一致します。
それ以来、新しいパターンを作成しました。
MYSCHEMA *=\s*\(DESCRIPTION =\s*\(ADDRESS *= *\(PROTOCOL *= *TCP\)\(HOST *= *(?<host>\w+)\)\(PORT *= *(?<port>\d+)\)\)\s*\(CONNECT_DATA *=\s*(?<serverdedicated>\(SERVER *= *DEDICATED\))\s*\(SERVICE_NAME *= *(?<servicename>[\w\.]+) *\)\s*\)\s*\)
このパターンはMYSCHEMAにのみ一致しますが、MYSCHEMAエントリに表示されるすべての要素を追加する必要があり、同じ要素がすべて含まれていない場合、MYOTHERSCHEMAとは一致しません。
理想的には、MYSCHEMAエントリのみに一致し、HOST、PORT、SERVICE NAME、およびオプションで(SERVER = DEDICATED)(最初のパターンにはありませんでした)を名前付きグループにキャプチャするパターンが必要です。
以下は、私がテストに使用しているサンプルのtnsnamesです。
SOMESCHEMA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = REMOTEHOST)(PORT = 1234))
)
(CONNECT_DATA = (SERVICE_NAME = REMOTE)
)
)
MYSCHEMA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = MYHOST)(PORT = 1234))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = MYSERVICE.LOCAL )
)
)
MYOTHERSCHEMA =
(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)
)
)