Parsing tnsnames.ora using regex

Ich versuche, mithilfe von Regex einige Informationen aus meiner tnsnames-Datei abzurufen. Ich habe mit folgendem Muster angefangen:

MYSCHEMA *? = *?[\W\w\S\s]*\(HOST *?= *?(?<host>\w+\s?)\)\s?\(PORT *?= *?(?<port>\d+)\s?\)[\W\w\S\s]*\(SERVICE_NAME *?= *?(?<servicename>\w+)\s?\)

Was gut funktioniert hat, wenn MYSCHEMA das einzige Schema in der Datei war, aber wenn nach MYSCHEMA andere Schemata aufgeführt sind, stimmt es bis zum letzten Schema überein.

Ich habe seitdem ein neues Muster erstellt:

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

Dieses Muster stimmt nur mit MYSCHEMA überein, aber ich musste jedes Element hinzufügen, das im Eintrag MYSCHEMA enthalten war, und es stimmt nicht mit MYOTHERSCHEMA überein, wenn es nicht alle gleichen Elemente enthält.

Ideally, ich hätte gerne ein Muster, das nur mit dem Eintrag MYSCHEMA übereinstimmt und HOST, PORT und SERVICE NAME sowie optional (SERVER = DEDICATED) (das ich im ersten Muster nicht hatte) zu benannten Gruppen erfasst.

Below ist der Beispiel-TNS-Name, den ich zum Testen verwendet habe:

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

Antworten auf die Frage(8)

Ihre Antwort auf die Frage