2013-03-06 4 views
2

Предположим, мне нужно совместить скобки, содержащие пробелы.Сканер Java. Как сопоставить пробелы?

Вот отрывок:

String input = "() () ()"; 
Pattern pattern = Pattern.compile("\\(\\s\\)"); 

Scanner scanner = new Scanner(input); 
scanner.useDelimiter("\\n"); 
Matcher matcher = pattern.matcher(input); 

System.out.println(scanner.hasNext(pattern)); // false 
System.out.println(matcher.find()); // true 
System.out.println(matcher.start(0) + " " + matcher.end(0)); // 0 3 

Сличитель делает именно то, что мне нужно, но сканер не делает.

Вопрос не задан правильно. Моя цель состояла в том, чтобы последовательно захватить все() токены в строке со сканером, потому что у сокета, похоже, есть неудобный API для такой задачи. Я должен был внимательно прочитать документацию.

метод, что мне нужно:

scanner.findInLine(pattern); 
+1

Возможный дубликат [Java, регулярное выражение catching string with white-space] (http://stackoverflow.com/questions/13313493/java-regular-expression-catching-string-with-white-space) – guerda

+0

Незначительное примечание : если вы хотите использовать новую строку в качестве разделителя, не используйте \\ n, но \ n или даже лучший результат 'System.getProperty (« line.separator »)'. – Pshemo

+0

Тело, похоже, явно не поддерживает название. В чем именно вопрос? –

ответ

1

Проверка Javadoc из Scanner.hasNext (Pattern):

Возвращает истину, если следующий полный маркер соответствует определенному шаблону ...

Таким образом, поскольку ваш шаблон Безразлично» t соответствует всему токену "() () ()", он вернет false.

Scanner однако есть функция findInLine, которая может делать то, что вы хотите:

scanner.findInLine(pattern); // returns "()" or null if not found 

(однако, этот метод может пропустить символы ...)

+0

«однако этот метод может пропускать символы» - что вы имеете в виду? – dmiandre

+0

Если у вас есть строка '' hello() world()() "' первый вызов с будет обнаружен первый ''() "' эффективно пропускающий "привет", второй вызов найдет второй (пропуская " мир "), а третий вызов найдет третий. Четвертый вызов вернет «null». – dacwe

+0

И это именно то, что мне нужно, спасибо! – dmiandre

0
 String input = "() () ()"; 
     Pattern pattern = Pattern.compile("\\(\\s\\)"); 

     Scanner scanner = new Scanner(input); 
     scanner.useDelimiter(pattern); //**CHANGED** 
     Matcher matcher = pattern.matcher(input); 

     System.out.println(scanner.hasNext()); //**CHANGED** 
     System.out.println(matcher.find()); 
     System.out.println(matcher.start(0) + " " + matcher.end(0)); // 0 3 

Обновить код, как описано выше.

Вы неправильно поняли useDelimiter(). Вы должны установить Pattern в качестве разделителя на свой объект Scanner.

+1

Мне нужно захватить(), чтобы не разделить его. В вашем случае scanner.next() не возвращает(). – dmiandre

1

При использовании "\\n" в качестве разделителя (и поэтому переопределить значение по умолчанию, которое является пробелом), весь ввод "() () ()" становится токеном.

Как hasNext пытается сопоставить полный маркер с pattern он возвращает false.

Из документации метод Scanner.hasNext(Pattern pattern)

Возвращает истину, если следующий полный маркер соответствует определенному шаблону.

Так что в вашем случае вызов метода на самом деле пытается соответствовать "() () ()" с "()".

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