gpt4 book ai didi

Java Scanner - 忽略后续字母

转载 作者:行者123 更新时间:2023-11-30 03:10:30 25 4
gpt4 key购买 nike

我的程序需要接受整数、单个字符或一个特定字符串(在本示例中我将使用 "pear")。虽然每个都可以用空格分隔,但应该没有必要这样做。

目前,我的解析代码依赖于 Scanner,如下所示:

Scanner scanner = new Scanner(System.in);

while (scanner.hasNext()) {
if (scanner.hasNext("\\s+")) {
// Ignore whitespace…

} else if (scanner.hasNext("[-]?\\d+")) {
// Get a number
String nextNumberString = scanner.next("[-]?\\d+");
// Process the string representing the number…

} else if (scanner.hasNext("pear")) {
scanner.next("pear");
// Do something special…

} else {
// Get the next character
Pattern oldDelimiter = scanner.delimiter();
scanner.useDelimiter("");
String nextCharAsString = scanner.next();
scanner.useDelimiter(oldDelimiter);

char nextCharacter = nextCharAsString.charAt(0);

if (Character.isWhitespace(nextCharacter)) {
// Ignore whitespace…
} else {
// Process character…
}

}
}

目前,我的程序可以毫无问题地接受像 123 d 456 r pear 这样的输入。但是,它还应该接受不带任何空格的相同输入(123d456rpear),并以相同的方式解释它,并且使用我当前的代码,各个数字被错误地解释为字符。

我觉得原因可能是我使用的正则表达式。但是,将 .* 添加到它们的末尾将导致解析所有后续字符以及我尝试解析的输入。例如,当我真的只想要 123 时,[-]?\d+.* 会尝试将整个 123d456rpear 解析为数字,剩下的留待以后解析。我还尝试将所需的输入包装到一个组中,然后附加 ?{1},但这也不起作用。

我还尝试过 scanner.findInLine(),但在我的测试中,这似乎也不起作用。例如,当我尝试这样做时,pearpear 会导致无限循环,尽管我尝试跳过 pear 的第一个实例。

我还尝试将分隔符设置为 "",就像提取单个字符时所做的那样(在这种情况下,按预期工作)。但是,这会导致单独处理每个单独的数字,解析 123 而不是 123pear 也被解释为单个字符。

那么,有人可以帮我弄清楚我哪里出了问题吗?这个问题是否出在我的正则表达式上?我使用了错误的方法吗?或者我是否误解了 Scanner 类的设计工作原理?

最佳答案

据我了解,Scanner 类的想法是提取标记并丢弃分隔符。但除了空格之外你不想扔掉任何东西。但是,您的输入中不需要空格。这是使用外部扫描器和内部扫描器的实现思路。外部在空格处进行标记 - 如果有的话。内部使用 findInLine() 来完全绕过分隔符。

findInLine

Attempts to find the next occurrence of a pattern constructed from the specified string, ignoring delimiters.

public void scan(Scanner scanner) {
while (scanner.hasNext()) {
String next = scanner.next();
System.out.println("opening inner scanner: " + next);
Scanner innerScanner = new Scanner(next);
do {
next = innerScanner.findInLine("([-]?\\d+)|(pear)|([a-zA-Z])");
if (next == null) {
// Nothing useful in there
} else if (next.equals("pear")) {
System.out.println("pear");
} else if (next.matches("[a-zA-Z]")) {
System.out.println("char: " + next);
} else {
System.out.println("number: " + next);
}
} while (next != null);
innerScanner.close();
}
}

public void run() {
scan(new Scanner("123 d 456 pear"));
scan(new Scanner("123d456pear"));
}

run()方法的输出如下:

opening inner scanner: 123
number: 123
opening inner scanner: d
char: d
opening inner scanner: 456
number: 456
opening inner scanner: pear
pear
opening inner scanner: 123d456pear
number: 123
char: d
number: 456
pear

关于Java Scanner - 忽略后续字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33721071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com