Сбой в начале / конце, потому что вы указываете (или, по крайней мере, пытаетесь указать ...), что совпадение должно включать ровно два слова начального и конечного контекста. Если ваш «dolor» - первое слово, перед ним ничего нет, поэтому совпадение не получится. Изменение {2}
на {0,2}
должно исправить эту часть.
Еще одна вещь, которая сразу бросается в глаза, это использование \w+?\b\s
. Вы, наверное, имеете в виду \w*\b\s
. *
означает «соответствовать нулю или более», что эквивалентно «по желанию соответствовать одному или нескольким», которые вы пытаетесь указать с помощью +?
. Также обратите внимание, что, если вы не измените \s
на \s+
, произойдет сбой в словах, разделенных несколькими пробелами. Есть также потенциальные проблемы с пунктуацией или другими символами, которые не являются ни словом, ни пробелами.
В конце концов, я думаю, что регулярные выражения могут быть не лучшим подходом к тому, чего вы пытаетесь достичь, или, по крайней мере, сами по себе. Наиболее эффективный способ сделать это, вероятно, состоит в создании настраиваемого полнотекстового поиска с обратным индексом, содержащим текст слова, его позицию (чтобы вы могли получить их в правильном порядке) и выделенное слово в контексте ( так что вы можете просто объединить их вместе для вашего конечного результата).
Если это не вариант, я бы пошел на разбиение текста на массив слов, а затем просканировал бы это для вашего целевого слова. Это не только облегчит выполнение ваших требований к контексту, но я ожидаю, что оно также будет работать быстрее, чем решение с использованием регулярных выражений, поскольку это сильно уменьшит потенциальную потребность в возврате. (OTOH, тем не менее, выполнение двух проходов по тексту (первый проход, чтобы разделить его на массив слов, второй проход, чтобы сравнить каждое слово с вашими поисковыми терминами) может изменить ситуацию по-другому.)