Используя пример фразы:
Всем мужчинам нравится виджеты , но некоторым мужчинам нравится виджеты больше, чем другим
Пример содержит два использования слова widgets . Что я пытаюсь сделать, это сопоставить биты снаружи. Обратите внимание, что хотя виджеты - это одно слово, я ищу решение для регулярных выражений, которое также будет работать с несколькими словами.
Учитывая приведенный выше пример, вывод будет содержать 3 совпадения:
- Всем мужчинам нравится
- но некоторым мужчинам нравится
- больше, чем другие
Пока у меня есть следующее регулярное выражение, которое работает только частично:
@"(?!widgets\b)\b\w+"
Ограничения заключаются в том, что он не может справиться с несколькими словосочетаниями - он также соответствует каждому отрицательному слову, а не всей последовательности слов, которые предшествуют / преуспевают, поэтому «все», «мужчины» и «как» вместо «все» мужчинам нравится ".
У меня есть другое решение, которое включает в себя более простое регулярное выражение и некоторые дополнительные преобразования и изменения в коде c #, но это не то решение, которым я доволен:
string EmboldenString(string text, string termToExclude)
{
var pattern = $@" ?{termToExclude} ?";
var tagStart = "<b>";
var tagEnd = "</b>";
var result = Regex.Replace($"{tagStart}{text}{tagEnd}", pattern, (match) =>
{
return $"{tagEnd}{match}{tagStart}";
});
var emptyTag = tagStart + tagEnd;
if (result.StartsWith(emptyTag))
result = result.TrimStart(emptyTag.ToCharArray());
if (result.EndsWith(emptyTag))
result = result.TrimEnd(emptyTag.ToCharArray());
return result;
}
Как видно из кода выше, цель состоит в добавлении тегов ко всем несовпадающим битам.
Кто-нибудь поможет с лучшим регулярным выражением.