Java Scanner vs Matcher-регулярные выражения, Matcher работает, сканер не

почему 1-й блок работает, а 2-й блок-нет?

int numberOfDigits = 2;
Pattern p = Pattern.compile("[01]{"+numberOfDigits+"}");
Matcher m = p.matcher("101100101011010011111000");
while(m.find()){
    System.out.println(m.group());
}

Блок 2

Scanner scannerSegment = new Scanner("101100101011010011111000");
   while(scannerSegment.hasNext(p)){
    String segment = scannerSegment.next(p);
        System.out.println(segment);

    }

1 ответов


Scanner не является подходящей утилитой для извлечения шаблонов с помощью его hasNext(Pattern pattern) метод . Он будет проверять, если далее комплекте маркер есть требуемый шаблон .

Java API является лучшим документом.

некоторые выдержки:

hasNext() : Returns true if the next complete token matches the specified 
pattern. A complete token is prefixed and postfixed by input that matches 
the delimiter pattern.`

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

Scanner scannerSegment = new Scanner("10 11 00 10 10 11 01 00 11 11 10 00");

даже это будет работать(для текущего шаблона):

Scanner scannerSegment = new Scanner("10,11,00,10,10,11,01,00,11,11,10,00");
scannerSegment.useDelimiter(",");

EDIT:сканер разбивает входные данные на токены с помощью шаблона разделителя, который по умолчанию соответствует пробелам.