Настройка Matcher для строковой фразы, которая может включать специальные символы в качестве литералов - PullRequest
0 голосов
/ 16 марта 2011

Не удается понять, как сопоставить строку фразы с фразой в потоке файла. Файл, с которым я имею дело, содержит случайные слова, такие как:

3 little pigs built houses and 1 little pig went to the market

и т.д.. для многих строк. В строке шаблона могут быть специальные символы, такие как V++ **A, поэтому мне нужен флаг LITERAL, чтобы их можно было найти вместо специального значения в регулярном выражении.

Мой шаблон pattern = Pattern.compile(searchString, Pattern.LITERAL);

Используя "little pig" в качестве строки шаблона и matcher.find(), я могу найти 2 совпадения: "маленькая свинья" и "маленькие свиньи". Тем не менее, я только хочу, чтобы это соответствовало "поросенку".

Что я могу сделать? Я думал об использовании matcher.lookingAt() или matcher.matches(), но я не знал бы, как установить правильную область, когда я не могу полагаться на строковые фразы файла, которые мне соответствуют, находясь в отдельных строках.

Ответы [ 4 ]

0 голосов
/ 16 марта 2011

Редактировать 4 (последний): полностью забыл, что нужно \\s|^ в начале

Редактировать 3: Немного подправлен, чтобы учесть, что char после searchString может быть концом строки search P = Pattern.compile("\\s"+Pattern.quote(searchString)+"(\\s|$)");

Редактировать 2: Хорошо, я понял! searchP = Pattern.compile("\\s"+Pattern.quote(searchString)+"\\s");

Не знаю, почему я не заметил этот метод цитат ... ну, хорошо, впервые за все:)

Редактировать: Оказывается, я опередил себя - код для специальных символов вообще не помог, поскольку literalP преобразуется в строку в searchP и теряет правило LITERAL для пользователя, строка.

Я думаю, что понял! Следующее преобразует строку пользователя в литерал, а затем помещает ее в новый шаблон, который позволяет \\s. Если кто-то видит проблемы с этим, пожалуйста, дайте мне знать.

Pattern literalP = Pattern.compile(searchString, Pattern.LITERAL);
Pattern searchP = Pattern.compile("\\s"+literalPattern+"\\s+");
0 голосов
/ 16 марта 2011

Как насчет этого шаблона, который будет соответствовать любой строке, содержащей строку little pig только один раз:

^.*little pig.*$

Который содержит:

  • ^ начало строки
  • .* ноль или более символов
  • $ конец строки
0 голосов
/ 16 марта 2011
String poet = "3 little pigs built houses and 1 little pig went to the market";
Pattern p = Pattern.compile("(little pig)\\B");
Matcher m = p.matcher(poet);
List<String> idx = new ArrayList<String>();
idx.add(m.group());
System.out.println(idx);
0 голосов
/ 16 марта 2011

Постоянно ли "маленький поросенок" завершается каким-либо другим символом, таким как пробел или перевод строки?Тогда вы можете добавить это к шаблону.

String pattern = "(little pig)[ \\r\\n]+";
...