Разбор tnsnames.ora с помощью регулярных выражений
Я пытаюсь извлечь некоторую информацию из моего файла 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, и, опционально (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)
)
)