У меня проблема BIG со следующим кодом. Я ожидаю, что он вернет n количество слов до и после найденного ключевого слова (иглы), но это никогда не произойдет.
Если у меня есть текст, скажите
"There is a lot of interesting stuff going on, when someone tries to find the needle in the haystack. Especially if there is anything to see blah blah blah".
И у меня есть это регулярное выражение:
"((?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,5}\b)needle(\b(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,5})"
Если это НЕ точно соответствует игле в данной строке и возвращает текст как
someone tries to find the needle in the haystack. Especially if
Это никогда не делает :-( При выполнении мой метод всегда возвращает пустую строку, хотя я определенно знаю, что ключевое слово находится в данном тексте.
private String trimStringAtWordBoundary(String haystack, int wordsBefore, int wordsAfter, String needle) {
if(haystack == null || haystack.trim().isEmpty()){
return haystack ;
}
String textsegments = "";
String patternString = "((?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,"+wordsBefore+"}\b)" + needle + "(\b(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,"+wordsAfter+"})";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(haystack);
logger.trace(">>> using regular expression: " + matcher.toString());
while(matcher.find()){
logger.trace(">>> found you between " + matcher.regionStart() + " and " + matcher.regionEnd());
String segText = matcher.group(0); // as well tried it with group(1)
textsegments += segText + "...";
}
return textsegments;
}
Совершенно очевидно, что проблема заключается в моем регулярном выражении, но я не могу понять, что с ним не так.
Ваше регулярное выражение в основном прекрасное, но на Java вам нужно избежать \b
:
"((?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,5}\\b)needle(\\b(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,5})"
\\b
учитывает пробелы? Я думал, что также должно быть \\s
присутствуют ...
\s
в том месте, где у вас есть\b
а также присутствует в классах символов, предшествующих / следующих за ним ... Что-то вроде"((?:[\w'\.-]+\s){0,"+wordsBefore+"})"
и аналогичные для после ...