Scanner.hasNext на основе начала следующей строки

#java

#java

Вопрос:

Я смотрю документацию сканера (https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html ) и я вижу, что существуют условные методы hasNext, которые возвращают true только в том случае, если следующий элемент удовлетворяет определенному условию. Допустим, у меня есть следующий сканер. Как я могу проверить, начинается ли следующий термин сканера с «a»?

 Scanner s = new Scanner("asd ab anob");
  

Комментарии:

1. Возьмите следующую строку. Используйте метод StartsWith

Ответ №1:

Шаблон, о котором идет речь, является регулярным выражением.

Регулярное выражение для «начинается с a» равно «^a. *»

 boolean a = s.hasNext("^a.*");
  

Комментарии:

1. В чем разница между s.hasNext(«^a.*») и s.hasNext(«a.*»)?

2. В этом случае, вероятно, нет никакой разницы. ^ означает «начало строки», но поскольку в этом случае вы сопоставляете всю строку, это не должно иметь никакого значения.

Ответ №2:

Работу должен выполнять hasNext (шаблон шаблона) или hasNext (шаблон строки), который дополнительно компилирует шаблон из строки в шаблон:

 if (s.hasNext("^a.*"))
    ... // next token starts with "a"
  

Ответ №3:

Что-то вроде этого.

 Scanner s = new Scanner("asd ab anob");

s.hasNext("a[a-z]*");
  

Это соответствует «словам», которые состоят из буквы «a», за которой следует ноль или более строчных «латинских» букв. Регулярное выражение может быть изменено, чтобы предоставить вам другие критерии для сопоставления «слова».

Если вы собираетесь делать это повторно, то лучше сделать следующее:

 private static Pattern WORD = Pattern.compile("a[a-z]*");

...

Scanner s = new Scanner("asd ab anob");
s.hasNext(WORD);
  

Согласно javadoc, применяются обычные правила работы с разделителями, и сопоставление шаблонов выполняется с использованием семантики «match». Это означает, что нет необходимости использовать «привязку» (например, «^») в регулярном выражении.

Ответ №4:

 Scanner s = new Scanner("asd ab anob");
String nextString = s.nextLine();
boolean result = nextString.startsWith("a");
  

Комментарии:

1. Это не делает то, что запрашивает OP. Он говорит, что хочет hasNext(...) сопоставить токен, начинающийся с ‘a’.

2. Да. Просто мисс поняла это. Спасибо.