代码之家  ›  专栏  ›  技术社区  ›  Manan Kapoor

用前缀解析逗号分隔字符串

  •  2
  • Manan Kapoor  · 技术社区  · 6 年前

    我得到的逗号分隔字符串格式如下:

    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 回复  |  直到 6 年前
        1
  •  2
  •   Youcef LAIDANI    6 年前

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

    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
    
        2
  •  2
  •   flyingfox    6 年前

    你可以用 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
    
        3
  •  1
  •   Tim Biegeleisen    6 年前

    这个怎么样:

    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