簡體   English   中英

Java掃描儀-忽略后續字母

[英]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會導致無限循環。

我還嘗試將定界符設置為"" ,就像我提取單個字符時所做的那樣(在這種情況下,可以按預期工作)。 然而,這導致被單獨地處理每個單獨的數,解析12 ,和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM