[英]Java Scanner - Ignore Subsequent Letters
我的程序需要接受整數,單個字符或一個特定的字符串(在此示例中,我將使用"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()
,但是在我的測試中,這似乎也不起作用。 例如,當我嘗試此操作時,盡管我嘗試跳過pear
的第一個實例,但是pearpear
會導致無限循環。
我還嘗試將定界符設置為""
,就像我提取單個字符時所做的那樣(在這種情況下,可以按預期工作)。 然而,這導致被單獨地處理每個單獨的數,解析1
, 2
,和3
,而不是123
。 pear
也被解釋為單個字符。
所以,有人可以幫我弄清楚我要去哪里哪里嗎? 這個問題與我的正則表達式有關嗎? 我使用了錯誤的方法嗎? 還是我誤會了Scanner
類的工作方式?
以我的理解,Scanner類的想法是提取令牌並丟棄定界符。 但是,除了空格,您不想丟掉其他任何東西。 但是,您的輸入中不需要空格。 這是通過使用外部和內部Scanner實現的想法。 外部標記在空白處-如果有的話。 內部使用findInLine()
完全繞過定界符。
findInLine
嘗試查找由指定字符串構造的模式的下一次出現,而忽略定界符。
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
好吧the individual digits are incorrectly interpreted as characters
因為Scanner的hasNext
方法從定界符中給定的令牌中提取令牌,默認情況下為空白
來自Java文檔
掃描程序使用定界符模式將其輸入分為令牌,默認情況下,該模式與空格匹配。 然后可以使用各種下一個方法將生成的令牌轉換為不同類型的值
因此,提取了整個123d456rpear
,它不是數字而是字符串
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.