解析以逗号分隔的字符串

时间:2018-07-19 11:21:40

标签: java string

我正在使用以下格式的逗号分隔字符串:

String codeList1 = "abc,pqr,100101,P101001,R108972";

String codeList2 = "mno, 100101,108972";

预期结果:删除第一个字母后,检查代码是否为数字。如果是,请删除前缀并返回。如果否,则仍返回代码。

codeList1 = "abc,pqr,100101,101001,108972"; 

codeList2 = "mno, 100101,108972";

如您所见,我可以获得代码(P101001或101001)和(R108972,108972)格式。只会有一个前缀。

如果我收到(P101001),我想删除'P'前缀并返回数字101001。

如果我收到101001,什么也不做。

下面是工作代码。但是,有没有更简单或更有效的方法来实现这一目标。请帮助

for (String code : codeList.split(",")) {
   if(StringUtils.isNumeric(code)) {
        codes.add(code);
   } else if(StringUtils.isNumeric(code.substring(1))) {
        codes.add(Integer.toString(Integer.parseInt(code.substring(1))));
   } else {
        codes.add(code);
     }
   }

3 个答案:

答案 0 :(得分:2)

如果要从数字中删除前缀,可以方便地使用:

String[] codes = {"abc,pqr,100101,P101001,R108972", "mno, 100101,108972"};
for (String code : codes){
    System.out.println(
            code.replaceAll("\\b[A-Z](\\d+)\\b", "$1")
    );
}

输出

abc,pqr,100101,101001,108972
mno, 100101,108972

如果您使用的是Java 8+,并且只想提取数字,则可以使用:

String codeList1 = "abc,pqr,100101,P101001,R108972";
List<Integer> results = Arrays.stream(codeList1.split("\\D")) //split with non degits
        .filter(c -> !c.isEmpty())                            //get only non empty results
        .map(Integer::valueOf)                                //convert string to Integer
        .collect(Collectors.toList());                        //collect to results to list

输出

100101
101001
108972

答案 1 :(得分:2)

您可以使用regex来完成

  String str = "abc,pqr,100101,P101001,R108972";
  String regex = ",?[a-zA-Z]{0,}(\\d+)";
  Pattern pattern = Pattern.compile(regex);
  Matcher matcher = pattern.matcher(str);
  while(matcher.find()){
      System.out.println(matcher.group(1));
  }

输出

100101
101001
108972

更新:
 对于您的评论(我要添加代码。如果找到单个字母前缀,请将其删除并添加剩余的),您可以使用以下代码:

String str = "abc,pqr,100101,P101001,R108972";
String regex = "(?=,?)[a-zA-Z]{0,}(?=\\d+)|\\s";// \\s is used to remove space
String[] strs = str.replaceAll(regex,"").split(",");

输出:

abc
pqr
100101
101001
108972

答案 2 :(得分:1)

如何?

String codeList1 = "abc,pqr,100101,P101001,R108972";
String[] codes = codeList1.split(",");

for (String code : codes) {
    if (code.matches("[A-Z]?\\d{6}")) {
        String codeF = code.replaceAll("[A-Z]+", "");
        System.out.println(codeF);
    }
}

100101
101001
108972

Demo

相关问题