通过字符串解析已知部分

时间:2011-03-14 13:35:10

标签: java string parsing design-patterns

我想知道从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”。

尝试编写一个接收连接字符串并在字符串数组列表中吐出主机/主机的方法。

3 个答案:

答案 0 :(得分:3)

使用这样的正则表达式应该有效:\(HOST=([^)]+)\)

不要忘记将Java String文字中的反斜杠加倍:

Pattern hostPattern = Pattern.compile("\\(HOST=([^)]+)\\)");

使用MatcherPatttern和您的输入字符串创建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>

干杯,