我希望能够解析如下字符串:“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中是否有任何帮助我的东西?
这个问题错过了太多的信息。因此,所有答案都对问题有效,但不对我的问题有效。
答案 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)
要将扫描仪用作标记器,请使用Compact
和findWithinHorizon
仅从组开始(=当前位置)进行扫描。
支持空格的示例(根据评论中的要求):
\G
在实际应用程序中,您可能应该预先编译模式。
答案 2 :(得分:1)
答案 3 :(得分:-1)
您可以将分隔符设置为无法匹配任何内容的模式,例如
Scanner s = ...
s.useDelimiter("(?!=a)a");