Это - вероятно, 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();
}
}
}
hasNext(String pattern)
возвращает true
только в том случае, если следующий маркер соответствует шаблону. В вашем случае "asda"
является следующим токеном, и он НЕ соответствует "[A-Z]+"
. Документация ясно говорит о том, что «сканер не проходит мимо каких-либо входных данных».
Если вы измените шаблон на "[A-Za-z]+"
, то вы получите три токена, которые могут быть тем, что вы намеревались.
Если на самом деле вы хотите получить только токены, которые соответствуют "[A-Z]+"
, то вы можете сделать любое из следующего:
useDelimiter("[^A-Z]+")
, а затем просто вызвать next()
skip("[^A-Z]+")
findInLine("[A-Z]+")
Совет: если производительность критическая, вы захотите использовать предкомпилированные перегрузки Pattern
этих методов.
Совет: имейте в виду, что "Xooo ABC"
имеет два "[A-Z]+"
совпадений. Если это не то, что вы хотите,тогда regex придется немного усложнить. Или вы всегда можете просто отказаться от несовпалительных токенов.
Измените
String pattern = "[A-Z]+";
на
String pattern = "[a-zA-Z]+";
Если вы хотите распечатать все слова, окруженные вашим разделителем, вы можете быть в безопасности и полностью исключить шаблон. Таким образом, вы не встретите слово, содержащее символ, которого нет в вашем шаблоне, что заставило бы вашу программу выйти из этого цикла (как это происходит сейчас). Например:
while ((sc.hasNext())) {
System.out.println(sc.next());
}