2013-04-17 3 views
7

Почему 1-й блок работает, но 2-й блок не работает?Сканер Java против Matcher - Регулярные выражения, Матчи работают, Сканер не

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

BLock 2

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

    } 

ответ

3

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 объекта), он будет работать. Так это должно работать (для текущего шаблона):

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: Scanner разбивает свой вклад в лексемы с использованием шаблона разделитель, который по умолчанию соответствует пробелу.

+0

Спасибо, есть ли у вас документация для поддержки? – Achow

+0

Вы уверены, что в случае создания объекта 'Scanner' с конструктором' Scanner (String source) 'этот сканер работает с исходной строкой, как с одним полным токеном? Я не нашел ничего, чтобы подтвердить свою догадку. – bsiamionau

+0

Не могли бы вы опубликовать полную рабочую демонстрацию? Это все еще не работает для меня. – bsiamionau