解析使用正则表达式的tnsnames.ora [英] Parsing tnsnames.ora using regex

查看:317
本文介绍了解析使用正则表达式的tnsnames.ora的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图拉从我TNSNAMES文件中使用正则表达式的一些信息。我开始与下面的模式:

MYSCHEMA *? ?= * [\ W \ W \ S \ S] * \(HOST * = *(<???主机> \ W + \ S)\?)\ S \(PORT * = *(&LT???? ;港口>?\ d +)\ S \)\ W \ W \ S \ S] * \(SERVICE_NAME * = *(<???SERVICENAME> \ W +)\ S \)

这工作得很好,当MYSCHEMA是在文件中的唯一模式,但是当有其他MYSCHEMA后上市的模式一路到最后一个模式相匹配。

因为我已经创建了一个新的模式:

MYSCHEMA * = \ s * \(DESCRIPTION = \ s * \(地址* = * \(PROTOCOL * = * TCP \)\(HOST * = *(<主机> \ W +)\)\(PORT * = *(<端口> \ D +)\)\)\ S * \(CONNECT_DATA * = \ s *(< serverdedicated> \(SERVER * = *专线\)) \ S * \(SERVICE_NAME * = *(< SERVICENAME> [:W \ \] +)* \)\ S * \)\ S * \)

此模式的匹配MYSCHEMA,但我不得不补充的是出现在MYSCHEMA进入每一个元素,它不会匹配MYOTHERSCHEMA如果它不包含所有相同的元素。

在理想情况下,我想一个只匹配MYSCHEMA进入图案,并捕获主机,端口和服务名,和任选的(SERVER = DEDICATED)(这是我的第一个模式没有)来命名组。

下面是我一直在使用的测试样品TNSNAMES:

  SOMESCHEMA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS =(PROTOCOL = TCP)(HOST = REMOTEHOST)(PORT = 1234))
    )
    (CONNECT_DATA =(SERVICE_NAME =远程)
    )
  )

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 =本地主机)(PORT = 1234))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = LOCAL)
    )
  )
 

解决方案

嗯,因为我还没有找到一个令人信服的答案,这个问题(没有犯罪@Mikael史云逊),我也只是停留在列出的第二个模式我题。这足以暂时,作为tnsnames.ora文件始终遵循本组织内的具体模式。如果tnsnames.ora文件格式的变化,我将最有可能采取的解析器。

I am attempting to pull some information from my tnsnames file using regex. I started with the following pattern:

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

which worked fine when MYSCHEMA was the only schema in the file, but when there are other schemas listed after MYSCHEMA it matches all the way to the last schema.

I have since created a new pattern:

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

This pattern matches MYSCHEMA only, but I had to add every element that appeared in MYSCHEMA entry, and it won't match MYOTHERSCHEMA if it does not contain all the same elements.

Ideally, I'd like a pattern that matches MYSCHEMA entry only, and captures HOST, PORT and SERVICE NAME, and optionally (SERVER = DEDICATED) (which I didn't have in the first pattern) to named groups.

Below is the sample tnsnames that I've been using for testing:

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

解决方案

Well, since I haven't found a compelling answer to this issue (no offense @Mikael Svenson), I have just stuck with the second pattern listed in my question. It is sufficient for the time being, as the tnsnames.ora file always follows that exact pattern within our organization. Should the tnsnames.ora file format change, I will most likely adopt a parser.

这篇关于解析使用正则表达式的tnsnames.ora的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆