Java 扫描仪从字符串中获取数字

Java Scanner get number from string

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

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

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

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

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

否则,例如,您可以将字符串设为一个 char 数组,遍历它并检查每个 char 是否是一个数字。

好吧,有几个选项。因为你真的想 跳过 "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);

你做什么取决于最适合你输入的内容。将 "non-digit" 替换为您要跳过的任何内容。


顺便信个灯scolding is in order for this:

Im unsure what the delimiter does.

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

另外,"delimiter"这个词的定义本身就是readily available

这里有一些基本错误。

首先,你说:

One = sc.nextInt("r1");

compiles correctly ...

不,不是。如果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();

然后提取上面的数字