Java字符串分割连续分隔符

7

我需要将来自外部源的字符串拆分。该字符串以插入符号"^"作为定界符,并且以下是如何将其拆分为数组:

String[] barcodeFields = contents.split("\\^+");

在这里输入图片描述

这个代码运行良好,但是有些传入的字段是空的,我需要考虑它们。我需要在任何缺失的字段中插入"""null""empty"

而且这些缺失的字段具有连续的分隔符。如何将Java字符串拆分为数组,并在连续的分隔符处插入字符串"empty"作为占位符?

4个回答

6

mureinik的答案很接近,但在一个重要的边缘情况下是错误的:当尾随定界符位于末尾时。为了考虑到这一点,您需要使用:

contents.split("\\^", -1)

例如,请查看以下代码:
final String line = "alpha ^beta ^^^";
List<String> fieldsA = Arrays.asList(line.split("\\^"));
List<String> fieldsB = Arrays.asList(line.split("\\^", -1));
System.out.printf("# of fieldsA is: %d\n", fieldsA.size());
System.out.printf("# of fieldsB is: %d\n", fieldsB.size());

以上打印出来的是:
# of fieldsA is: 2
# of fieldsB is: 5

4

String.split在遇到连续的分隔符时会留下一个空字符串(""),只要你使用正确的正则表达式。如果你想将它替换为"empty",你需要自己这样做:

String[] split = barcodeFields.split("\\^");
for (int i = 0; i < split.length; ++i) {
    if (split[i].length() == 0) {
        split[i] = "empty";
    }
}

那正是正在发生的事情,我已经添加了一张截图。Java将 "" 视为空。 - Val Okafor
如果在末尾有尾随分隔符,则此操作将失败。请参见:https://dev59.com/lY3da4cB1Zd3GeqP2Z_R#58648034 - Marcus Junius Brutus

2
使用^+表示一个或多个连续的插入符号。去掉加号。
String[] barcodeFields = contents.split("\\^");

它不会“吃掉”空字段。对于空字段,您将得到(您请求的)""


嗨,艾略特,我添加了一张截图,去掉加号后,它会插入"",但是Java会将其视为空数组中的空白,因此barcodeFields.size()会给出9个条目而不是10个条目。 - Val Okafor
数组有一个 length 属性(而不是 size() 方法)。我更喜欢使用 .isEmpty() 而不是 .length() == 0 - Elliott Frisch

-1
以下代码的输出结果为:[blah, , bladiblah, moarblah]
    String test = "blah^^bladiblah^moarblah";
    System.out.println(Arrays.toString(test.split("\\^")));

在这里,^^ 被替换为一个空字符串 ""


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接