Разбор 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)
    )
  )

Ответы на вопрос(4)

Ваш ответ на вопрос