Проблема с сопоставлением токена в строке при использовании Scanner в Java - PullRequest
1 голос
/ 04 августа 2009

Мне нужно сопоставить определенные вещи из строк входного текста. Линии выглядят так:

 to be/ Σ _ Σ  [1pos, 1neg] {0=1, 2=1}

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

 Scanner scanner = new Scanner(file);
 while(scanner.hasNext()) {
      String line = scanner.nextLine();
      System.out.println("line: " + line);
      Pattern p_pos = Pattern.compile("to");
      Matcher m_pos = p_pos.matcher(line);
      String match = m_pos.group(0);
      System.out.println("match: " + match);
      boolean b_pos = m_pos.matches();
      if(b_pos) {
          System.out.println(match);
      }
 }

Выход:

line:    to be/ Σ _ Σ  [1pos, 1neg] {0=1, 2=1}
Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:485)
    at lady.PhrasesFromFile.readFile(PhrasesFromFile.java:31)
    at lady.PhrasesFromFile.main(PhrasesFromFile.java:17)

У меня есть еще один вопрос: как я могу обработать строку, чтобы я мог хранить все от начала строки до первого символа "/"? Я не мог найти какой-либо метод для этого в API. Возможно ли это сделать? Я в основном хочу последовательно пройти через строку, сохранить фрагменты строки в различных переменных, а затем использовать значения этих переменных. Поскольку я не знаю, сколько токенов у меня до первого символа «/», я не могу использовать next () определенное количество раз.

Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 04 августа 2009

Вы можете извлечь нужную часть для токенов, используя:

String tokenSection = Pattern.compile("(to\\s+.*?)/").matcher(line).find().group(1);

и затем циклически извлекаем токены, используя

Pattern.compile("\\w+").matcher(tokenSection).find();

Очевидно, что вы не подключите вышеупомянутые фрагменты кода прямо к нему.

1 голос
/ 04 августа 2009

.matches() пытается сопоставить всю строку ввода. Используйте .find(), если хотите сопоставить часть входной строки, или .lookingAt(), если хотите сопоставить начало входной строки.

http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html

Кроме того, если вы расширили свой шаблон, включив в него совпадающие группы (для получения более подробной информации о том, как работают сопоставимые группы, см. Общий справочник по регулярным выражениям), вы можете использовать функцию .group() после успешного сопоставления, чтобы извлечь подстроку, сопоставленную определенным группа в шаблоне.

...