如果第一个令牌为空,则Java Scanner会忽略它

问题描述 投票:2回答:2

我正在尝试使用扫描仪读取String令牌的InputStream。每个标记都以逗号,结尾。空字符串""也是有效的标记。在这种情况下,整个令牌只是结束它的逗号。

从另一个进程缓慢读取InputStream,任何令牌应在完全读取后立即处理。因此,将整个InputStream读取为String是不可能的。

示例输入可能如下所示:

ab,,cde,fg,

如果我将扫描仪的分隔符设置为逗号,它似乎可以很好地处理工作。

InputStream input = slowlyArrivingStreamWithValues("ab,,cde,fg,");

Scanner scan = new Scanner(input);
scan.useDelimiter(Pattern.quote(","));
while (scan.hasNext()) {
    System.out.println(scan.next());
}

输出:

ab

cde
fg

但是,当流以空令牌开头时,会出现问题。出于某种原因,如果第一个令牌为空,则Scanner会忽略它。

/* begins with empty token */
InputStream input = slowlyArrivingStreamWithValues(",ab,,cde,fg,");
...

输出:

ab

cde
fg

为什么Scanner会忽略第一个令牌?我怎么能包括它?

java java.util.scanner
2个回答
0
投票

尝试使用lookbehind作为模式:

(?<=,)

然后用您匹配的每个标记将空字符串替换为逗号。请考虑以下代码:

String input = ",ab,,cde,fg,";
Scanner scan = new Scanner(input);
scan.useDelimiter("(?<=,)");
while (scan.hasNext()) {
    System.out.println(scan.next().replaceAll(",", ""));
}

这输出如下:

(empty line)
ab

cde
fg

Demo


0
投票

如果你自己编写它,而不使用Scanner会更容易:

static List<String> getValues(String source){
    List<String> list = new ArrayList<String>();
    for(int i = 0; i < source.length();i++){
        String s = "";
        while(source.charAt(i) != ','){
            s+=source.charAt(i++);
            if(i >= source.length()) break;
        }
        list.add(s);
    }
    return list;
}

例如,如果source = ",a,,b,,c,d,e",输出将是"", "a", "", "c", "d", "e"

© www.soinside.com 2019 - 2024. All rights reserved.