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)
    )
  )

questionAnswers(4)

yourAnswerToTheQuestion