Java扫描程序-忽略后续字母
我的程序需要接受整数、单个字符或一个特定字符串(本例中我将使用Java扫描程序-忽略后续字母,java,regex,parsing,java.util.scanner,Java,Regex,Parsing,Java.util.scanner,我的程序需要接受整数、单个字符或一个特定字符串(本例中我将使用“pear”)。虽然每一个都可以用空格分隔,但不需要这样做 目前,我的解析代码依赖于扫描仪,如下所示: Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { if (scanner.hasNext("\\s+")) { // Ignore whitespace… } else if (scanner.hasNext
“pear”
)。虽然每一个都可以用空格分隔,但不需要这样做
目前,我的解析代码依赖于扫描仪
,如下所示:
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
类是如何工作的吗?好的单个数字被错误地解释为字符
,因为hasNext
Scanner方法从默认为空白的给定中提取令牌
来自java文档
扫描仪使用分隔符模式将其输入拆分为标记,
默认情况下与空白匹配。由此产生的代币可以是
使用不同的next转换为不同类型的值
方法
因此,整个
123d456rpear
被提取出来,它不是一个数字,而是一个字符串据我所知,Scanner类的思想是提取令牌并扔掉定界符。但除了空格,你不想扔掉任何东西。但是,输入中不需要空格。下面是一个使用外部和内部扫描仪的实现思想。外部标记在空白处(如果有)。内部使用findInLine()
findInLine
尝试查找由
指定的字符串,忽略分隔符
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
程序应该如何区分单个字符和像pear这样的字符串?通常,单个字符被解释为某种命令,但是如果输入了这个特殊字符串,我必须包含一个复活节彩蛋。这就是为什么我在将输入解释为单个字符之前要检查这个特殊字符串。@YassinHajaj该字符串只是一个特定的魔法字符串,而不是一般的字符串。因此,如果可以找到字符串“pear”,解析器会优先解析该字符串,否则会读取单个字符,例如,“pead”将被解析为“p”、“e”、“a”、“d”,但“peard”将被解析为“pear”、“d”。确切地说,感谢@IngoBürk这可能是真的,但这并不能帮助我更接近所需的功能……就我的理解而言,Scanner类的思想是提取标记并扔掉分隔符。这就是阿努帕姆引用的话。但如果输入中没有空格,您根本不想扔掉任何东西。因此Scanner可能是错误的类,或者只有findInLine()
对您的问题有用。非常感谢!很抱歉反应太慢,但我最终还是从这段代码倒退到了只使用一台扫描仪的代码。谢谢你的帮助!伟大的您认为将您的单扫描仪解决方案添加到问题或其他地方是否有用?
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