下面是来自某个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(":")拆分给我字符串数组,但是我只需要两个长度大小的字符串数组。例如,响应A17属性给我"CCTV“作为attributes1,”走廊CC“作为attributes2,但我需要"CCTV:走廊CC”作为属性1。
我应该用string.split(regexp)编写什么样的正则表达式,这样就可以根据冒号运算符的第一个实例分割字符串,而只有两个长度的字符串数组。
发布于 2016-01-21 05:04:16
下面的代码首先在管道上拆分,然后使用regex提取属性和属性。请注意,即使在那里,您可能还可以进行另一次拆分。
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);
}正如这里的其他人所说,正则表达式不是治愈所有开发问题的灵丹妙药。对于这个问题,分裂肯定是一个很大的负担。
发布于 2016-01-21 05:03:52
设定一个限制在你的分裂上。
String[] attributes = string.split(":", 2);这将强制regex只应用一次(根据它应用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]发布于 2016-01-21 05:31:12
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 classhttps://stackoverflow.com/questions/34915657
复制相似问题