有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将字符串拆分为子数组

我有一个字符串,比如:

OG=ACC-0000000009| AMBORFFA KIRI|P.O.BOX 1FAF6GPO,GPO,FG/FFERER      OB=XXXX-XXCC|ABC|14332 X HWay|Vica |MNSJD      IS=BIC-dfsgdf|asas nduf|142 ERRET ERT RET|ERTERT Island|ERTERT     BF=ACC-0000013417711DD028|534 DFG ION|ONE DALLAERRS CENTER RR N.|     ERTERT, SUITE 1300, DRRALLAS,|Pb, 75201/ PBB      DT=GREAT CHART|0000FGHFGGL028434  

在OG、OB、IS等值之间没有分隔符。我希望根据“=”来拆分数组,以便OG、OB。。。字段包含在结果拆分中。我需要进一步处理子文件的这些字段


共 (4) 个答案

  1. # 1 楼答案

    正则表达式可能是解决方案之一。但如果可以的话,我建议使用分隔符

    这是我的解决方案,但我不确定它是否在所有情况下都有效:

    public static void main(String[] args){
    
        String text = "OG=ACC-0000000009| AMBORFFA KIRI|P.O.BOX 1FAF6GPO,GPO,FG/FFERER      OB=XXXX-XXCC|ABC|14332 X HWay|Vica |MNSJD      IS=BIC-dfsgdf|asas nduf|142 ERRET ERT RET|ERTERT Island|ERTERT     BF=ACC-0000013417711DD028|534 DFG ION|ONE DALLAERRS CENTER RR N.|     ERTERT, SUITE 1300, DRRALLAS,|Pb, 75201/ PBB      DT=GREAT CHART|0000FGHFGGL028434";
    
        //Regex for field
        String regexField = "(?<field>[A-Z]+)(:?[=])";
    
        Pattern pattern = Pattern.compile(regexField);
        Matcher matcher = pattern.matcher(text);
    
        //extract fields names
        List<String> fields = new ArrayList<>();
        while(matcher.find()){
            fields.add(matcher.group("field"));
        }
    
        //extract values using split and regex for fields
        List<String> values = Arrays.stream(text.split(regexField))
                                    .map(String::trim)
                                    .filter(e -> !e.isEmpty())
                                    .collect(Collectors.toList());
    
        //group fields and values
        Map<String, String> data = new HashMap<>();
        if(fields.size() == values.size()){
    
            for(int i = 0; i < fields.size(); i++){
                data.put(fields.get(i), values.get(i));
            }
    
        }else{
    
            System.out.println("Size are different. Something is not good.");
    
        }
    
        data.forEach((k, v) -> System.out.println(k + " -> " + v));
    
    }
    
  2. # 2 楼答案

    下面是一个Scala regex解决方案:

    val data = "OG=ACC-0000000009| AMBORFFA KIRI|P.O.BOX 1FAF6GPO,GPO,FG/FFERER..."
    
    data.split("""(?=\w\w=)""")
    

    这使用了一种前瞻模式,在后面跟两个单词字符和一个=符号的点拆分数据

  3. # 3 楼答案

    像这样的?(Scala代码)

    val str =
      "OG=ACC-0000000009| AMBORFFA KIRI|P.O.BOX 1FAF6GPO,GPO,FG/FFERER      OB=XXXX-XXCC|ABC|14332 X HWay|Vica |MNSJD      IS=BIC-dfsgdf|asas nduf|142 ERRET ERT RET|ERTERT Island|ERTERT     BF=ACC-0000013417711DD028|534 DFG ION|ONE DALLAERRS CENTER RR N.|     ERTERT, SUITE 1300, DRRALLAS,|Pb, 75201/ PBB      DT=GREAT CHART|0000FGHFGGL028434  "
    
    str.split("(?=\\S\\S=)")
       .foldLeft(Map.empty[String,Array[String]]){
         case (m,s) => m+(s.take(2) -> s.drop(3).split("\\|"))
       }
    //res0: Map[String,Array[String]] = 
    // HashMap(OG -> Array(ACC-0000000009, " AMBORFFA KIRI", "P.O.BOX 1FAF6GPO,GPO,FG/FFERER      ")
    //       , OB -> Array(XXXX-XXCC, ABC, 14332 X HWay, "Vica ", "MNSJD      ")
    //       , DT -> Array(GREAT CHART, "0000FGHFGGL028434  ")
    //       , IS -> Array(BIC-dfsgdf, asas nduf, 142 ERRET ERT RET, ERTERT Island, "ERTERT     ")
    //       , BF -> Array(ACC-0000013417711DD028, 534 DFG ION, ONE DALLAERRS CENTER RR N., "     ERTERT, SUITE 1300, DRRALLAS,", "Pb, 75201/ PBB      "))
    

    更新:根据评论添加新要求

    val str =
      "OG=ACC-0000000009| AMBORFFA KIRI|P.O.BOX 1FAF6GPO,GPO,FG/FFERER Transaction Amount= 1223|546SD|376KL OB=XXXX-XXCC|ABC|14332 X HWay|Vica |MNSJD      IS=BIC-dfsgdf|asas nduf|142 ERRET ERT RET|ERTERT Island|ERTERT     BF=ACC-0000013417711DD028|534 DFG ION|ONE DALLAERRS CENTER RR N.|     ERTERT, SUITE 1300, DRRALLAS,|Pb, 75201/ PBB      DT=GREAT CHART|0000FGHFGGL028434  "
    
    str.split(raw"\b(?=Transaction Amount=|\S\S=)")
       .foldLeft(Map.empty[String,Array[String]]){
         case (m,s) => val (k,v) = s.splitAt(s.indexOf("="))
                       m + (k -> v.tail.split("\\|"))
       }
    //HashMap(OG -> Array(ACC-0000000009, " AMBORFFA KIRI", "P.O.BOX 1FAF6GPO,GPO,FG/FFERER ")
    //      , OB -> Array(XXXX-XXCC, ABC, 14332 X HWay, "Vica ", "MNSJD      ")
    //      , Transaction Amount -> Array(" 1223", 546SD, "376KL ")
    //      , DT -> Array(GREAT CHART, "0000FGHFGGL028434  ")
    //      , IS -> Array(BIC-dfsgdf, asas nduf, 142 ERRET ERT RET, ERTERT Island, "ERTERT     ")
    //      , BF -> Array(ACC-0000013417711DD028, 534 DFG ION, ONE DALLAERRS CENTER RR N., "     ERTERT, SUITE 1300, DRRALLAS,", "Pb, 75201/ PBB      "))
    
  4. # 4 楼答案

     String OG = "ACC-0000000009| AMBORFFA KIRI|P.O.BOX 1FAF6GPO,GPO,FG/FFERER ";
        String[] split = OG.split(",");//以逗号为分隔符转换为字符串数组
        for (int i = 0; i < split.length; i++) {//遍历数组
            System.out.println(split[i]);