【发布时间】:2016-02-16 16:57:50
【问题描述】:
我的程序需要接受整数、单个字符或一个特定的字符串(我将在此示例中使用"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),并以相同的方式解释它,并且使用我当前的代码,单个数字被错误地解释为字符。
我觉得原因可能是我正在使用的正则表达式。但是,将.* 添加到它们的末尾将导致解析所有后续字符以及我尝试解析的输入。例如,[-]?\d+.* 将尝试将整个123d456rpear 解析为一个数字,而我真的只想要123,剩下的留待以后解析。我还尝试将我想要的输入包装到一个组中,然后附加 ? 或 {1},这也不起作用。
我也尝试过scanner.findInLine(),但在我的测试中,这似乎也不起作用。例如,当我尝试这样做时,pearpear 会导致无限循环,尽管我尝试跳过 pear 的第一个实例。
我还尝试将分隔符设置为"",就像我在提取单个字符时所做的那样(在这种情况下,它可以按预期工作)。但是,这会导致单独处理每个单独的数字,解析 1、2 和 3 而不是 123。 pear 也被解释为单个字符。
那么,有人可以帮我弄清楚我哪里出错了吗?这个问题出在我的正则表达式上吗?我使用了错误的方法吗?还是我误解了 Scanner 类的工作原理?
【问题讨论】:
-
程序应该如何区分单个字符和像梨这样的字符串?
-
通常,单个字符被解释为某种命令,但如果输入这个特殊字符串,我必须包含一个复活节彩蛋。这就是为什么我在解释之前检查这个特殊字符串的原因输入为单个字符。
-
@YassinHajaj 该字符串只是一个特定的魔术字符串,而不是一般的字符串。因此解析器优先解析字符串“pear”(如果可以找到),否则会读取单个字符,例如“pead”将被解析为“p”、“e”、“a”、“d”,但是“梨”将被解析为“梨”,“d”。
-
没错,谢谢@IngoBürk
标签: java regex parsing java.util.scanner