仅使用第一个实例 java 拆分字符串



>我从某个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

最新更新