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