如何在 String.split() 中允许空字符串?

How to allow empty strings in String.split()?

我正在使用 String.split() 拆分字符串。我收到的字符串具有以下结构:

[data]<US>[data]<US>

其中 <US> 是 ASCII 单位分隔符(代码 0x1F)。要拆分的代码是

String[] fields = someString.split(String.valueOf(0x1f));

这很好用,除非 [DATA] 是一个空字符串。在这种情况下,数据将被跳过。

我想要一个像 [DATA]<US><US>[DATA]<US> 这样的字符串到 return 一个包含三个元素的数组:[DATA]null[DATA]

我该怎么做?

如果您将 split 参数化为 -1 作为第二个参数,您将得到一个空的 String,其中 [data] 缺失(但 null).

someString.split(String.valueOf(0x1f), -1);

解释 来自docs

If n is non-positive then the pattern will be applied as many times as possible and the array can have any length.

.. 其中 n 是极限,即第二个参数。

这是一个工作代码

String s="[DATA]<US><US>[DATA]<US>";
String arr []= s.split("<US>");
for(String str :arr) {
    if(str.equals("")) {
        System.out.println("null");
    } else {
        System.out.println(str);
    }       
}

输出::

[DATA]
null
[DATA]

根据您的要求更具体:

public String [] format(String s) {     
        String arr []= s.split("<US>");     
        for(int i=0;i<arr.length;i++)
        {
            if(arr[i].equals(""))
            {
                arr[i]=null;
            }           
        }
        return arr;
    }

之后您可以简单地遍历数组并将空字符串分配为 null:

public class StringSplitting {

    public static void main(String[] args){

        String inputs = "[data]<US><US>[data]<US>";

        String[] fields = inputs.split("<US>");


        //set empty values to null
        for(int i = 0; i < fields.length; i++){
            if(fields[i].length() == 0){
                fields[i] = null;
            }
        }

        //print output
        for(String e: fields){
            if(e == null){
                System.out.println("null");
            }else{
                System.out.println(e);
            }
        }
    }
}