>我从某个telnet服务器得到了以下响应
String response = "I:BARCO@noiclt22815||K:CMS||O:REgetPerspectiveList||A0:googleP||A1:yahooP||A2:gmail||A3:test||A4:hello||A16:CCTV Barco||A17:CCTV: Corridor CC||A18:CCTV: DR Andy Warhol||A19:CCTV: DR Gaudi (Analog)||A20:CCTV: DR Miro||A21:CCTV: Entrance CC||A22:CCTV: Gaudi Demo Room Megapixel||";
我想获取例如 A0、A1 等的属性值,因此我编写以下逻辑
String[] strings = response.split("[||]");
List<String> list = new ArrayList<>();
for (String string : strings) {
if (string.contains(":")) {
String[] attributes = string.split(":");
if (attributes[0].startsWith("A")) {
list.add(attributes[1]);
}
}
}
但我的问题是 string.split(":") split 给了我字符串数组,但我只需要两个长度大小的字符串数组。例如,响应 A17 属性给我"CCTV"作为属性 [1] 和"走廊 CC"作为属性 [2],但我只需要"CCTV:走廊 CC"作为属性 [1]。
我应该在string.split(regexp)中写什么正则表达式,以便字符串可以根据冒号运算符的第一个实例进行拆分,只有两个长度大小的字符串数组。
代码首先在管道上拆分,然后使用正则表达式提取属性和属性。 请注意,即使在那里,您也可能可以侥幸进行另一次拆分。
String response = "I:BARCO@noiclt22815||K:CMS||O:REgetPerspectiveList||A0:googleP||A1:yahooP||A2:gmail||A3:test||A4:hello||A16:CCTV Barco||A17:CCTV: Corridor CC||A18:CCTV: DR Andy Warhol||A19:CCTV: DR Gaudi (Analog)||A20:CCTV: DR Miro||A21:CCTV: Entrance CC||A22:CCTV: Gaudi Demo Room Megapixel||";
String[] metaParts = response.split("\|\|");
for (int i=0; i < metaParts.length; ++i) {
String property = metaParts[i].replaceAll("(.*):(.*)", "$1");
String attribute = metaParts[i].replaceAll("(.*):(.*)", "$2");
System.out.println(property + ":" + attribute);
}
正如这里的其他人所说,正则表达式不是解决所有发展问题的灵丹妙药。 而分裂肯定是解决这个问题的繁重工作。
设置拆分限制。
String[] attributes = string.split(":", 2);
这将强制正则表达式仅应用一次(根据文档,它已应用 n-1 次),因此您的分组只会在冒号字符上拆分一次。
一旦应用到代码中,结果如下:
[googleP, yahooP, gmail, test, hello, CCTV Barco, CCTV: Corridor CC, CCTV: DR Andy Warhol, CCTV: DR Gaudi (Analog), CCTV: DR Miro, CCTV: Entrance CC, CCTV: Gaudi Demo Room Megapixel]
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex {
public static void main(String[] args) {
String response = "I:BARCO@noiclt22815||K:CMS||O:REgetPerspectiveList||A0:googleP||A1:yahooP||A2:gmail||A3:test||A4:hello||A16:CCTV Barco||A17:CCTV: Corridor CC||A18:CCTV: DR Andy Warhol||A19:CCTV: DR Gaudi (Analog)||A20:CCTV: DR Miro||A21:CCTV: Entrance CC||A22:CCTV: Gaudi Demo Room Megapixel||";
Matcher mat = Pattern.compile("([^\:]+)\:([^\|]+)\|\|").matcher(response);
HashMap<String, String> hm = new HashMap();
while( mat.find() ) {
if(mat.groupCount() > 0) {
String k = response.substring( mat.start(1), mat.end(1));
String v = response.substring( mat.start(2), mat.end(2));
hm.put(k, v);
System.out.println(k + " => " + v); // debug
}
}
// you may refer to your data from hashmap hm here!
System.out.println(hm.get("K"));
}
} // end class