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

时间:2018-01-02 04:37:34

标签: java java.util.scanner

我试图用扫描仪读取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会忽略第一个令牌?我怎么能包括它?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"