我想知道从oracle连接字符串中解析“HOST”名称的最佳方法是什么。以下是一个示例连接字符串:
数据 源=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = MYHOST)(PORT = MyPort上)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = MyOracleSID)))
我在String
中拥有它。让“MyHost”返回的最佳方法是什么?如果它适用于双连接字符串也会很好,例如:
((数据 源=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = MyHost1)(PORT = MyPort1)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = MyOracleSID1))))(数据 源=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = MyHost2)(PORT = MyPort2)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = MyOracleSID2)))))
将返回“MyHost1”和“MyHost2”。
尝试编写一个接收连接字符串并在字符串数组列表中吐出主机/主机的方法。
答案 0 :(得分:3)
使用这样的正则表达式应该有效:\(HOST=([^)]+)\)
。
不要忘记将Java String
文字中的反斜杠加倍:
Pattern hostPattern = Pattern.compile("\\(HOST=([^)]+)\\)");
使用Matcher
从Patttern
和您的输入字符串创建matcher()
并调用find()
,直到它返回false
。使用group(1)
获取主机名:
Matcher m = hostPattern.matcher(input);
while (m.find()) {
System.out.println(m.group(1));
}
答案 1 :(得分:1)
扩展Joachim的想法(我有一段时间没有使用过ArrayLists,所以它可能不完全正确):
public List<String> getHosts(String conString) {
List<String> conns = new ArrayList<String>()
Pattern hostPattern = Pattern.compile("\\(HOST=([^)]+)\\)");
Matcher m = hostPattern.matcher(conString);
while(m.find()) {
conns.add(m.group(1));
}
return conns;
}
编辑:感谢Bart的修复!
答案 2 :(得分:0)
正则表达式\(HOST =(。*?)\)将匹配“(HOST = MyHost1)”和“(HOST = MyHost2)”部分作为分别包含“MyHost1”和“MyHost2”的两个组。 / p>
干杯,
版