2013-11-06 6 views
9

В соответствии с Java API Scanner использует разделители для разбивки всего ввода на токены. Я пытаюсь понять токены и разделители. Я делал эту программу и ударил путаницуРазделитель в сканере Java confusion

import java.util.Scanner; 

public class Test { 
    public static void main(String[] args) { 
     Scanner s = null; 
     try { 
      s = new Scanner(System.in); 
      s.useDelimiter("A"); 
      System.out.println("1 " + s.next().length()); 
      System.out.println("2 " + s.next().length()); 
      System.out.println("3 " + s.next().length()); 
      System.out.println("4 " + s.next().length()); 
     } finally { 
      if (s != null) { 
       s.close(); 
      } 
     } 
    } 
} 

Когда я использую вход AAAAAasdf я получаю следующий результат.

1 0 
2 0 
3 0 
4 0 

Я могу понять этот вывод, как длина маркеров равна нулю между ограничителями, следовательно, все равны нулю, но, когда я использую стандартные разделители и дать входные данные как

_____aaa\n -> Заменить подчеркивание пробелом и \n Я нахожу вход в консоли затмения.

Для этого я получаю выход в

1 3 

, которые я не могу понять. Я дал 5 пробелов, поэтому между ними должно быть 4 жетона длиной 0. Почему нет? Что мне здесь не хватает?

+0

я предполагаю сканер пропускает пространства – njzk2

+0

@ njzk2 Он работает в соответствии с регулярными выражениями шаблонов. См. Наиболее употребимый ответ и ссылку на API в комментарии. –

ответ

7

useDelimiter принимает шаблон регулярного выражения. Образец по умолчанию:

private static Pattern WHITESPACE_PATTERN = Pattern.compile(
              "\\p{javaWhitespace}+"); 

Это будет соответствовать любому количеству смежных пробелов. Если вы хотите, чтобы разделитель, чтобы соответствовать любое количество смежных А попробовать что-то вроде

s.useDelimiter("[A]+"); 

Читайте эти: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#useDelimiter(java.lang.String) http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#reset()

+0

Правильный ответ. Найденный в ссылке API. Пожалуйста, добавьте это также. http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#reset() –

+0

Если кому-то интересно, это ссылка на OpenJDK. Найдите 'WHITESPACE_PATTERN', и вы увидите заявление, данное в этом ответе. http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/java/util/Scanner.java –

0

Ее очень интересно посмотреть, что когда мы указываем «» (пустое пространство) в качестве разделителя в коде

try { 
     s = new Scanner(System.in); 
     s.useDelimiter(" "); 
     System.out.println("1 " + s.next().length()); 
     System.out.println("2 " + s.next().length()); 
     System.out.println("3 " + s.next().length()); 
     System.out.println("4 " + s.next().length()); 
    } finally { 
     if (s != null) { 
      s.close(); 
     } 
    } 

и входом является

[5 spaces]asdf 

мы видим вывод

1 0 
2 0 
3 0 
4 0 

Но когда мы не указать разделитель,

try { 
     s = new Scanner(System.in); 
     //s.useDelimiter(" "); 
     System.out.println("1 " + s.next().length()); 
     System.out.println("2 " + s.next().length()); 
     System.out.println("3 " + s.next().length()); 
     System.out.println("4 " + s.next().length()); 
    } finally { 
     if (s != null) { 
      s.close(); 
     } 
    } 

тот же вход

[5 spaces]asdf 

генерирует другой вывод

1 4 

Итак, я думаю, указывая разделитель, хотя по умолчанию он делает сканер пропусками всех пустых токенов.

0

Scanner.next() Функция Находит и возвращает следующий полный токен с этого сканера. Перед первым токеном предшествует вход, который соответствует delimiter pattern. Образец по умолчанию: \\p{javaWhitespace}+.

Чтобы понять это лучше, попробуйте Эттинг разделителем "\\s*":

Scanner scanner = new Scanner(System.in); 
scanner.useDelimiter("\\s*"); 
while(scanner.hasNext()) 
    System.out.println(scanner.next()); 

Для входа 123, он scanner.next() напечатает:

1 // first println 
2 //snd println 
3 // third println 

Как говорит, что картина X может произойти нулевой или больше раз. Это выражение известно как Quantifiers. Однако выражение X+ говорит, что X, one or more times. Так попробуйте использовать разделитель "[A]+", который говорит, что "A" происходит один или несколько раз, и соответствует любому количеству смежных "A"