2015-05-18 1 views
0

У меня есть шаблон String pageText="Hello World, How areyou doing" (без пробела). и есть поиск pattern, представляющего "How are you"Match Pattern игнорировать пустое пространство в источнике во время match.find

Matcher matcher = pattern.matcher(pageText)); 
int count = 0; 
while (matcher.find()) { 
    count++; 
} 

counter возвращается 0 как пространство отсутствует в моих pageText переменных.

Есть ли способ игнорировать проверку пробелов и должен быть в состоянии найти соответствие для шаблона «Как вы»?

+0

Перед сопоставлением удалите все пробелы из объектов и строк поиска. Вы можете даже избежать регулярного выражения и использовать 'String # contains' – anubhava

ответ

0

Один из простейших способов можно заменить пробела с \s* в регулярных выражениях шаблона так будет выглядеть как "How\\s*are\\s*you" так что это может соответствовать HowareyouHow areyouHoware you.

String pageText="Hello World, How areyou doing"; 

Pattern pattern = Pattern.compile("How are you".replaceAll("\\s+","\\\\s*")); 

Matcher matcher = pattern.matcher(pageText); 
int count = 0; 
while (matcher.find()) { 
    count++; 
} 

System.out.println(count); 

Edit:

Поскольку вы используете Pattern.quote, чтобы избежать всех регулярных выражений специальные символы добавляющие \s* внутри не имеет особого смысла, так как он также будет экранировать. Простое решение для этого будет цитировать только слова, так как только они могут иметь регулярное выражение метасимволы, которые требуют побега, поэтому мы lookinf для решения, которое будет строить нам что-то вроде

quote(word1)\s*quote(word2)\s*quote(word3) 

кодекса, который может выглядеть следующим образом:

String pageText = "Hello World, How areyou doing"; 
String searchFor = "How are you"; 

String searchingRegex = Stream.of(searchFor.split("\\s+"))//stream of words 
     .map(word -> Pattern.quote(word))//quote each word 
     .collect(Collectors.joining("\\s*"));//join words with `\s*` delimiter 

Pattern pattern = Pattern.compile(searchingRegex); 
//... 
+0

Спасибо shemo, он работает в одном сценарии, но я не могу использовать этот заменитель в сочетании с pattern.quote (« Как вы ».replaceAll (" \\ s + », "\\\\ с *")); String pageText = "Hello World, How are youou (Рисунок 6a)"; Поиск строкPattern = «Как вы (рис. 6a)»; Pattern pattern = Pattern.compile (Pattern.quote (searchPattern.replaceAll ("\\ s +", "\\\\ s *"))); \t Matcher matcher = pattern.matcher (pageText); \t int count = 0; \t while (matcher.find()) { \t кол-во ++; \t} System.out.println ("count:" + count); – ndippy

+0

Ну, цель 'Pattern.quote' - создать регулярное выражение, которое будет соответствовать нашему тексту буквально. Одним из решений может быть изменение цитаты из цельной строки в отдельные слова, а затем объединение их с помощью '\ s *' между тем мы получим что-то вроде 'quote (word1) \ s * quote (word2) \ s * quote (word3)' , Будет обновлен мой ответ с помощью примера кода. – Pshemo