Вы можете попробовать что-то вроде этого:
using System;
using System.Text.RegularExpressions;
static class Program {
static void Main(params string[] args) {
string text = @"Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea
commodo consequat.";
ExtractParagraph(text, "magna");
ExtractParagraph(text, "ipsum");
ExtractParagraph(text, "ut");
}
static void ExtractParagraph(string text, string word) {
Console.WriteLine("Matches for: {0}", word);
string expression = @"((^.{0,30}|\w*.{30})\b" + word + @"\b(.{30}\w*|.{0,30}$))";
Regex wordMatch = new Regex(expression, RegexOptions.IgnoreCase | RegexOptions.Singleline);
foreach (Match m in wordMatch.Matches(text)) {
Console.WriteLine(" {0}", m.Value);
}
}
}
Основная идея состоит в том, чтобы сопоставить дополнительные слова со словом: .*{30}\bword\b.*{30}
, а затем добавить несколько «символов слова», чтобы слово не разрезалось пополам: \w*.*{30}\bword\b.*{30}\w*
.
Кусочки типа ^.{0,30}
и. .{0,30}$
должны совпадать, даже если в начале или конце предложения содержится менее 30 символов.
Как всегда с регулярными выражениями, это вряд ли выиграет конкурс на читабельность, но, похоже, работает ...