Вернуть указанное количество слов до и после заданной позиции в тексте

1

У меня проблема 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;
}

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

  • 0
    Похоже, вы не предусмотрели пробельные символы в выражении, обычно вы используете \s в том месте, где у вас есть \b а также присутствует в классах символов, предшествующих / следующих за ним ... Что-то вроде "((?:[\w'\.-]+\s){0,"+wordsBefore+"})" и аналогичные для после ...
Теги:
words

1 ответ

3
Лучший ответ

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

"((?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,5}\\b)needle(\\b(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,5})"
  • 0
    Может быть, я что-то упускаю, но действительно ли \\b учитывает пробелы? Я думал, что также должно быть \\s присутствуют ...
  • 0
    \ b - метасимвол границы слова, поэтому он соответствует немного больше пробелов.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню