2015-06-04 2 views
1

У меня возникли проблемы с разбором python, например списками со сканерами на Java. По какой-то причине я, кажется, что-то делаю неправильно, когда пытаюсь обнаружить квадратные скобки. Что меня больше всего волнует, так это то, что как-то появление квадратных скобок во входе вызывает нежелательное поведение.Сканер Java не соответствует квадратным скобкам

Scanner scanner1 = new Scanner("a["); 
assert(scanner1.hasNext("a\\[")); // Does not trigger assertion 

Scanner scanner2 = new Scanner("[[0]]"); 
assert(scanner2.hasNext("\\[")); // Triggers assertion, but why? 

Scanner scanner3 = new Scanner(" a[[[0]]"); 
assert(scanner3.hasNext("a\\[")); // Triggers assertion, but why? 

Это использование

openjdk version "1.8.0_45" 
OpenJDK Runtime Environment (build 1.8.0_45-b14) 
OpenJDK 64-Bit Server VM (build 25.45-b02, mixed mode) 
+0

Что здесь не работает? Scanner.hasNext соответствует следующему токену, в первом случае его '' a ["' поэтому он совпадает с patter. Но во втором случае его '' [[0]] "', но вы пытаетесь сопоставить его с '' ["' alone. Если вы хотите совместить их, ваш шаблон должен быть '' \\ [. * "' – Codebender

+0

Aaaah, поэтому в отличие от 'skip()' Мне нужно «разрешить» дополнительные символы. Это действительно имеет смысл. –

ответ

1

Сканера

Сканер имеет расколоть вход в лексемы, расщепляется разделителем (хорошее объяснение http://www.tutorialspoint.com/java/util/java_util_scanner.htm), по умолчанию является пробелом. Поскольку у вас нет разделительных символов, первый токен - это целая строка, поэтому ваш шаблон в hasNext должен соответствовать всей строке, а не только ее частям.

Решения: Вам нужно создать правильный синтаксис регулярных выражений, чтобы соответствовать всей строке

Scanner scanner1 = new Scanner("a["); 
assert(scanner1.hasNext("a\\[")); 

Scanner scanner2 = new Scanner("[[0]]"); 
assert(scanner2.hasNext("\\[.*")); 

Scanner scanner3 = new Scanner(" a[[[0]]"); 
assert(scanner3.hasNext("a\\[.*")); 

Другим способ заключается в использовании findInLine

Scanner scanner2 = new Scanner("[[0]]"); 
String inline = scanner2.findInLine("\\[.*")); 
assert(inline!=null); 
+0

Aaaah, поэтому в отличие от 'skip()' Мне нужно «разрешить» дополнительные символы. Это действительно имеет смысл. –

+0

Да, или вы также можете использовать '.findInLine (...)' для поиска любого шаблона без ссылки на остальные – rst

1

По умолчанию разделителя сканера является пробелом, поэтому в в первом случае токен «a [» найден, но в других случаях токены не сопоставляются, потому что ожидаемый токен не найден: [ отличается от [[0]].

Например, добавление необходимые пробелы:

public static void main (String[] args) throws java.lang.Exception { 
    Scanner scanner1 = new Scanner("a["); 
    System.out.println(scanner1.hasNext("a\\[")); //true   
    Scanner scanner2 = new Scanner("[ [0]]"); 
    System.out.println(scanner2.hasNext("\\[")); //true 
    Scanner scanner3 = new Scanner(" a[ [ [0]]"); 
    System.out.println(scanner3.hasNext("a\\[")); //true 
} 

Другими словами, ожидаемый маркер должен совпадать полностью, а не частично, а разделитель должен быть правильно определен. Вы можете играть с этим кодом here

Смежные вопросы