没有分隔符的扫描仪

时间:2011-01-25 21:14:24

标签: java java.util.scanner

我希望能够解析如下字符串:“123456abcd9876az45678”。 BNF是这样的:

number: ? definition of an int ?
word: letter { , letter }
expression: number { , word , number }

但java.util.scanner类不允许我执行以下操作:

Scanner s = new Scanner("-123456abcd9876az45678");
System.out.println(s.nextInt());
while (s.hasNext("[a-z]+")) {
    System.out.println(s.next("[a-z]+"));
    System.out.println(s.nextInt());
}

理想情况下,这应该产生:

-123456
abcd
987
az
45678

我真的希望java.util.Scanner会帮助我,但看起来我必须创建自己的扫描仪。 Java API中是否有任何帮助我的东西?


这个问题错过了太多的信息。因此,所有答案都对问题有效,但不对我的问题有效。

4 个答案:

答案 0 :(得分:3)

不幸的是,您不能对Scanner类AFAIK使用无分隔符。如果您希望忽略分隔符,则需要使用执行此操作的方法,例如findInLine()findWithinHorizon()。在您的情况下,findWithinHorizion()是合适的。

Scanner s = new Scanner("-123456abcd9876az45678");
Pattern num = Pattern.compile("[+-]?\\d+");
Pattern letters = Pattern.compile("[A-Za-z]+");
System.out.println(s.findWithinHorizon(num, 0));
String str;
while ((str = s.findWithinHorizon(letters, 0)) != null) {
    System.out.println(str);
    System.out.println(s.findWithinHorizon(num, 0));
}

答案 1 :(得分:2)

要将扫描仪用作标记器,请使用CompactfindWithinHorizon仅从组开始(=当前位置)进行扫描。

支持空格的示例(根据评论中的要求):

\G

在实际应用程序中,您可能应该预先编译模式。

答案 2 :(得分:1)

您可以使用PatternMatcher类来实现此目的。请参阅this示例。

答案 3 :(得分:-1)

您可以将分隔符设置为无法匹配任何内容的模式,例如

Scanner s = ...
s.useDelimiter("(?!=a)a");