Analizando tnsnames.ora usando regex
Estoy intentando extraer alguna información de mi archivo tnsnames usando regex. Comencé con el siguiente patrón:
MYSCHEMA *? = *?[\W\w\S\s]*\(HOST *?= *?(?<host>\w+\s?)\)\s?\(PORT *?= *?(?<port>\d+)\s?\)[\W\w\S\s]*\(SERVICE_NAME *?= *?(?<servicename>\w+)\s?\)
que funcionó bien cuando MYSCHEMA era el único esquema en el archivo, pero cuando hay otros esquemas listados después de MYSCHEMA, coincide hasta el último esquema.
Desde entonces he creado un nuevo patrón:
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*\)
Este patrón solo coincide con MYSCHEMA, pero tuve que agregar todos los elementos que aparecieron en la entrada MYSCHEMA, y no coincidirá con MYOTHERSCHEMA si no contiene los mismos elementos.
Idealmente, me gustaría un patrón que coincida solo con la entrada MYSCHEMA y capture HOST, PORT y SERVICE NAME, y opcionalmente (SERVER = DEDICATED) (que no tenía en el primer patrón) a grupos con nombre.
A continuación se muestran los nombres de tns de muestra que he estado usando para probar:
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)
)
)