Проблема с совпадающим токеном в строке при использовании Scanner на Java

StackOverflow https://stackoverflow.com/questions/1225009

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

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

 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() определенное количество раз.

Заранее благодарю вас.

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top