Регулярное выражение для ограничения строки самым коротким совпадением по сравнению с самым длинным совпадением (нежадная группа)?

Я ищу в абзацах текста.

Я хотел бы найти строки в тех абзацах, которые начинаются с определенного слова, а затем взять текст, который следует сразу за этим совпадающим словом. Я хотел бы остановиться при встрече с первой точкой, восклицательным знаком, вопросительным знаком или новой строкой ... Если ни один из них не найден в пределах 100 символов от поискового слова, я хотел бы обрезать строку у слова граница, ближайшая к пределу в 100 символов.

Как я могу это сделать?

ПРИМЕР

string: "A test sentence containing an ngram and ending with a period. Another sentence that does not have the word we're searching for and runs on until we're past 100 characters."

regex: /\bngram(.{0,100})(\.|\b)/i

desired output: ' and ending with a period'

В этом случае мое регулярное выражение возвращает «и заканчивается точкой. Другое предложение, в котором нет искомого слова, и выполняется». Это продолжается дольше, чем я хотел, потому что это группа захвата точки / границы слова жадная (может быть?). Я не знаю, как ограничить более короткое совпадение по сравнению с самым длинным.


person T. Brian Jones    schedule 20.03.2015    source источник


Ответы (1)


используйте отрицательный класс символов, исключающий точку!

/\bngram([^.]{0,100})(\b|\.)/i
person Casimir et Hippolyte    schedule 20.03.2015