Java: сканирование строки для шаблона

Это - вероятно, quicky. Почему это кодирует не, возвращают что-нибудь?

import java.util.Scanner;

public class MainClass {

public static void main(String[] args) {
    try {

        Scanner sc = new Scanner("asda ASA adad");
        String pattern = "[A-Z]+";

        while ((sc.hasNext(pattern))) {

            System.out.println(sc.next(pattern));
        }
        sc.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}
10
задан skaffman 15 May 2011 в 12:45
поделиться

3 ответа

hasNext(String pattern) возвращает true только в том случае, если следующий маркер соответствует шаблону. В вашем случае "asda" является следующим токеном, и он НЕ соответствует "[A-Z]+". Документация ясно говорит о том, что «сканер не проходит мимо каких-либо входных данных».

Если вы измените шаблон на "[A-Za-z]+", то вы получите три токена, которые могут быть тем, что вы намеревались.

Если на самом деле вы хотите получить только токены, которые соответствуют "[A-Z]+", то вы можете сделать любое из следующего:

  • просто отбросить несоответствующие токены
  • useDelimiter("[^A-Z]+"), а затем просто вызвать next()
  • use skip("[^A-Z]+")
  • use findInLine("[A-Z]+")

Совет: если производительность критическая, вы захотите использовать предкомпилированные перегрузки Pattern этих методов.

Совет: имейте в виду, что "Xooo ABC" имеет два "[A-Z]+" совпадений. Если это не то, что вы хотите,тогда regex придется немного усложнить. Или вы всегда можете просто отказаться от несовпалительных токенов.

16
ответ дан 3 December 2019 в 21:59
поделиться

Измените

String pattern = "[A-Z]+";

на

String pattern = "[a-zA-Z]+";
0
ответ дан 3 December 2019 в 21:59
поделиться

Если вы хотите распечатать все слова, окруженные вашим разделителем, вы можете быть в безопасности и полностью исключить шаблон. Таким образом, вы не встретите слово, содержащее символ, которого нет в вашем шаблоне, что заставило бы вашу программу выйти из этого цикла (как это происходит сейчас). Например:

    while ((sc.hasNext())) {

        System.out.println(sc.next());
    }
0
ответ дан 3 December 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: