Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过已知节的字符串进行解析_Java_String_Parsing_Design Patterns - Fatal编程技术网

Java 通过已知节的字符串进行解析

Java 通过已知节的字符串进行解析,java,string,parsing,design-patterns,Java,String,Parsing,Design Patterns,我想知道从oracle连接字符串中解析“主机”名称的最佳方法是什么。下面是一个连接字符串示例: 资料 源=(描述=(地址\列表=(地址=(协议=TCP)(主机=我的主机)(端口=我的端口))(连接\数据=(服务器=专用)(服务\名称=MyOracleSID))) 我把它放在一个字符串中。返回“MyHost”的最佳方式是什么。如果它适用于双连接字符串,也会很好,例如: ((数据) 源=(描述=(地址\列表=(地址=(协议=TCP)(主机=MyHost1)(端口=MyPort1))(连接\数据=(服

我想知道从oracle连接字符串中解析“主机”名称的最佳方法是什么。下面是一个连接字符串示例:

资料 源=(描述=(地址\列表=(地址=(协议=TCP)(主机=我的主机)(端口=我的端口))(连接\数据=(服务器=专用)(服务\名称=MyOracleSID)))

我把它放在一个
字符串中。返回“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”


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

使用这样的正则表达式应该可以工作:
\(主机=([^)]+)\

不要忘记在Java
String
literals中加倍反斜杠:

Pattern hostPattern = Pattern.compile("\\(HOST=([^)]+)\\)");
使用并调用从该
pattern
和输入字符串创建一个,直到返回
false
。用于获取主机名:

Matcher m = hostPattern.matcher(input);
while (m.find()) {
  System.out.println(m.group(1));
}

使用这样的正则表达式应该可以:
\(主机=([^]+)\)

不要忘记在Java
String
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:那也没问题,我只是习惯了这个版本;-)