【发布时间】:2019-08-10 07:40:32
【问题描述】:
我正在尝试使用正则表达式从我的 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 NAME,以及可选的 (SERVER = DEDICATED)(我在第一个模式中没有)到命名组。
以下是我用于测试的示例 tnsname:
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)
)
)
【问题讨论】:
-
正则表达式不适用于平衡括号,请参阅上一条评论中的链接以获得更好的解决方案。
-
@Kobi - 我无法证明将另一个第三方产品添加到我们的开发环境中可以通过其他方式完成。
-
Welton - 那是你的事,但我会使用解析器。发布的解决方案没有太多代码,但是有一个很少有人能理解和支持的正则表达式,我不知道它是否支持full syntax - 它可能会失败一晚......当然,有可能这个正是您所需要的。只是提供一个替代方案。祝你好运!
标签: c# .net regex oracle tnsnames