仅包含第一个实例java

时间:2016-01-21 04:54:16

标签: java arrays regex string

我从一些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(&#34;:&#34;)split给了我字符串数组但我只需要两个长度大小的字符串数组。对于例如响应A17属性给了我&#34; CCTV&#34;作为属性[1]和&#34;走廊CC&#34;作为属性[2],但我需要&#34; CCTV:Corridor CC&#34;仅作为属性[1]。

我应该在string.split(regexp)中编写什么正则表达式,以便可以根据冒号运算符的第一个实例仅使用两个长度大小的字符串数组来拆分字符串。

3 个答案:

答案 0 :(得分:1)

下面的代码首先拆分管道,然后使用正则表达式来提取属性和属性。请注意,即使在那里,你也可能会做另一次分裂。

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);
}

正如其他人所说,正则表达不是解决所有发展问题的灵丹妙药。分裂肯定是解决这个问题的重任。

答案 1 :(得分:0)

你的分裂

Set a limit

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]

答案 2 :(得分:0)

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