Java Scanner从字符串中获取数字

时间:2016-10-09 14:35:22

标签: java string int tokenize

字符串是,例如"r1",我需要1形式的int

Scanner sc = new Scanner("r1");
int result = sc.nextInt(); // should be 1

正确编译但有运行时错误,我应该使用分隔符吗?我不确定分隔符的作用。

3 个答案:

答案 0 :(得分:4)

嗯,有几个选择。由于您确实希望跳过“r”然后读取数字,您可以使用Scanner#skip。例如,要跳过所有非数字,请阅读数字:

Scanner sc = new Scanner("r1");
sc.skip("[^0-9]*");
int n = sc.nextInt();    

如果没有前导非数字,那也可以。

另一种选择是使用非数字作为分隔符,如您所述。例如:

Scanner sc = new Scanner("x1 r2kk3 4 x56y 7g");
sc.useDelimiter("[^0-9]+"); // note we use + not *
while (sc.hasNextInt())
    System.out.println(sc.nextInt());

输出六个数字:1,2,3,4,56,7。

另一种选择,取决于输入的性质,是通过提前用空格替换所有非数字来预处理字符串,然后使用默认配置的扫描程序,例如:

String input = "r1";
input = input.replaceAll("[^0-9]+", " ");

当然,你总是可以预先处理字符串以删除第一个字符,如果你知道它是那个形式,然后使用扫描仪(或只是Integer#parseInt):

String input = "r1";
input = input.substring(1);

您的工作取决于您最适合的输入。将“非数字”替换为您想要跳过的任何内容。

顺便说一句,我相信一盏灯scolding is in order for this

  

我不确定分隔符的作用。

介绍文字中Scanner explains this quite clearly的文档,甚至展示了一个示例。

此外,“分隔符”一词的定义本身是readily available

答案 1 :(得分:0)

如果所有输入的格式都相同,那么最后一个字符是您可以使用的值:

String s = sc.nextLine()
Int i = Integer.parseInt(s.charAt(s.length() -1));

否则,您可以将字符串作为char数组,通过它迭代并检查每个字符是否为数字。

答案 2 :(得分:0)

这里有一些根本性的错误。

首先,你说:

  

One = sc.nextInt("r1");

     

正确编译......

不,不。如果sc确实是java.util.Scanner,那么就没有Scanner.nextInt(String)方法,因此无法编译。

第二个问题是hasNextXXXnextXXX方法不解析它们的参数。它们解析扫描仪输入源中的字符。

第三个问题是Scanner没有提供一种方法来完成你(显然)试图做的事情。

如果您的String s包含值"r1",那么您根本不需要Scanner。你需要做什么这样的事情:

String s = ...
int i = Integer.parseInt(s.substring(1));

或者可能是这样的:

Matcher m = Pattern.compile("r(\\d+)").matcher(s);
if (m.matches()) {
    int i = Integer.parseInt(m.group(1));
}

...在提取数字之前检查字段是否为预期格式。

另一方面,如果你真的想从扫描仪中读取字符串,你可以这样做:

String s = sc.next();

然后按上述方式提取数字。