首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只使用第一个实例java拆分字符串

问只使用第一个实例java拆分字符串
EN

Stack Overflow用户
提问于 2016-01-21 04:54:16
回答 3查看 743关注 0票数 2

下面是来自某个telnet服务器的响应

代码语言:javascript
复制
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等,因此我编写了以下逻辑

代码语言:javascript
复制
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)编写什么样的正则表达式,这样就可以根据冒号运算符的第一个实例分割字符串,而只有两个长度的字符串数组。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-21 05:04:16

下面的代码首先在管道上拆分,然后使用regex提取属性和属性。请注意,即使在那里,您可能还可以进行另一次拆分。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-01-21 05:03:52

设定一个限制在你的分裂上。

代码语言:javascript
复制
String[] attributes = string.split(":", 2);

这将强制regex只应用一次(根据它应用n-1次的文档),所以您的分组只会在冒号字符上分割一次。

一旦应用到代码中,结果如下:

代码语言:javascript
复制
[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]
票数 1
EN

Stack Overflow用户

发布于 2016-01-21 05:31:12

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34915657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档