Analisando tnsnames.ora usando regex
Estou tentando extrair algumas informações do meu arquivo tnsnames usando o regex. Comecei com o seguinte padrão:
MYSCHEMA *? = *?[\W\w\S\s]*\(HOST *?= *?(?<host>\w+\s?)\)\s?\(PORT *?= *?(?<port>\d+)\s?\)[\W\w\S\s]*\(SERVICE_NAME *?= *?(?<servicename>\w+)\s?\)
que funcionou bem quando MYSCHEMA era o único esquema no arquivo, mas quando há outros esquemas listados após MYSCHEMA, ele corresponde ao último esquema.
Desde então, criei um novo padrão:
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*\)
Esse padrão corresponde apenas ao MYSCHEMA, mas eu precisei adicionar todos os elementos que apareceram na entrada MYSCHEMA e não corresponderá ao MYOTHERSCHEMA se não contiver os mesmos elementos.
Idealmente, eu gostaria de um padrão que corresponda apenas à entrada MYSCHEMA e captura HOST, PORT e NOME DO SERVIÇO e, opcionalmente (SERVIDOR = DEDICADO) (que eu não tinha no primeiro padrão) para grupos nomeados.
Abaixo está o exemplo tnsnames que eu tenho usado para testar:
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)
)
)