Java 通过已知节的字符串进行解析
我想知道从oracle连接字符串中解析“主机”名称的最佳方法是什么。下面是一个连接字符串示例: 资料 源=(描述=(地址\列表=(地址=(协议=TCP)(主机=我的主机)(端口=我的端口))(连接\数据=(服务器=专用)(服务\名称=MyOracleSID))) 我把它放在一个Java 通过已知节的字符串进行解析,java,string,parsing,design-patterns,Java,String,Parsing,Design Patterns,我想知道从oracle连接字符串中解析“主机”名称的最佳方法是什么。下面是一个连接字符串示例: 资料 源=(描述=(地址\列表=(地址=(协议=TCP)(主机=我的主机)(端口=我的端口))(连接\数据=(服务器=专用)(服务\名称=MyOracleSID))) 我把它放在一个字符串中。返回“MyHost”的最佳方式是什么。如果它适用于双连接字符串,也会很好,例如: ((数据) 源=(描述=(地址\列表=(地址=(协议=TCP)(主机=MyHost1)(端口=MyPort1))(连接\数据=(服
字符串中。返回“MyHost”的最佳方式是什么。如果它适用于双连接字符串,也会很好,例如:
((数据)
源=(描述=(地址\列表=(地址=(协议=TCP)(主机=MyHost1)(端口=MyPort1))(连接\数据=(服务器=专用)(服务\名称=MyOracleSID1)))(数据
Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost2)(PORT=MyPort2))(CONNECT_DATA=(SERVER=decified)(SERVICE_NAME=MyOracleSID2‘‘‘‘)’)
将返回“MyHost1”和“MyHost2”
尝试编写一个方法,该方法接收连接字符串并在字符串数组列表中吐出主机。使用这样的正则表达式应该可以工作:\(主机=([^)]+)\
不要忘记在JavaString
literals中加倍反斜杠:
Pattern hostPattern = Pattern.compile("\\(HOST=([^)]+)\\)");
使用并调用从该pattern
和输入字符串创建一个,直到返回false
。用于获取主机名:
Matcher m = hostPattern.matcher(input);
while (m.find()) {
System.out.println(m.group(1));
}
使用这样的正则表达式应该可以:\(主机=([^]+)\)
不要忘记在JavaString
literals中加倍反斜杠:
Pattern hostPattern = Pattern.compile("\\(HOST=([^)]+)\\)");
使用并调用从该pattern
和输入字符串创建一个,直到返回false
。用于获取主机名:
Matcher m = hostPattern.matcher(input);
while (m.find()) {
System.out.println(m.group(1));
}
扩展Joachim的想法(我已经有一段时间没有使用ArrayList了,所以它可能不完全正确):
public List getHosts(字符串构造){
列表连接=新的ArrayList()
Pattern hostPattern=Pattern.compile(“\\(主机=([^)]+)\\)”;
Matcher m=主机模式。Matcher(构造);
while(m.find()){
新增(m组(1));
}
返回接头;
}
编辑:感谢巴特的修复 扩展Joachim的想法(我有一段时间没有使用ArrayList了,所以它可能不完全正确):
public List getHosts(字符串构造){
列表连接=新的ArrayList()
Pattern hostPattern=Pattern.compile(“\\(主机=([^)]+)\\)”;
Matcher m=主机模式。Matcher(构造);
while(m.find()){
新增(m组(1));
}
返回接头;
}
编辑:感谢巴特的修复 正则表达式\(HOST=(.*)\)将匹配节“(HOST=MyHost1)”和“(HOST=MyHost2)”作为两个组,分别包含“MyHost1”和“MyHost2”
干杯
Ed正则表达式\(HOST=(.*)\)将匹配节“(HOST=MyHost1)”和“(HOST=MyHost2)”作为两个组,分别包含“MyHost1”和“MyHost2”
干杯
Ed如何将模式应用于字符串,以便获取主机名作为返回?不太熟悉模式,但我以前用过它们来拆分字符串,但从来没有提取过值。非贪婪通配符不是更简单一点吗<代码>\(主机=(.*)\)
还是我遗漏了什么?@Mark:那也没问题,我只是习惯了这个版本;-)如何将模式应用于字符串,以便获取主机名作为返回?不太熟悉模式,但我以前用过它们来拆分字符串,但从来没有提取过值。非贪婪通配符不是更简单一点吗<代码>\(主机=(.*)\)还是我遗漏了什么?@Mark:那也没问题,我只是习惯了这个版本;-)