Лучший способ сделать поиск строки и заменить

2

Мне нужно написать код, который выделяет HTML-код для определенных ключевых слов в строке.

Если у меня есть список строк, разделенных запятыми, и я хотел бы выполнить поиск и заменить на другую строку для каждой записи в списке. Каков наиболее эффективный способ сделать это?

В настоящее время я делаю это с помощью split, затем foreach и Regex.Match. Например:

string wordsToCheck = "this", "the", "and";
String listArray[] = wordsToCheck.Split(',');
string contentToReplace = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";

foreach (string word in listArray)
{
    if (Regex.Match(contentToReplace, word + "\\s+", RegexOptions.IgnoreCase).Success)
    {
        return Regex.Replace(contentToReplace , word + "\\s+", String.Format("<span style=\"background-color:yellow;\">{0}</span> ", word), RegexOptions.IgnoreCase);
    }
}

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

  • 0
    см. stackoverflow.com/questions/711753/…
  • 0
    Я в конечном итоге с помощью этого кода: Regex.Replace (contentToReplace, wordsToCheck + "\\ s +", "<span style = \" background: yellow; \ "> $ 1 </ span>", RegexOptions.Singleline | RegexOptions.IgnoreCase) ;
Теги:
string

3 ответа

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

Не делайте этого, если словаToCheck могут быть изменены пользователем!

Ваш подход отлично работает без регулярных выражений. Просто выполните обычную String.Replace.

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

return Regex.Replace(contentToReplace, "(this|the|and)", String.Format("<span style=\"background-color:yellow;\">{0}</span> ", word), RegexOptions.IgnoreCase);

где "this | the | and" просто wordsToCheck, где запятые заменяют на трубы "|".

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

0

Что касается ваших соображений по проблемам производительности, другие пользователи рассказали об использовании 1 регулярного выражения, и они правы, для еще лучшего перформанса (теоретически) вы могли бы использовать скомпилированный флаг, тем более что вы не будете менять свое регулярное выражение, для более информацию, которую вы можете прочитать this.

0

Вы можете выполнить поиск "(this | the | end)" и вызвать Regex.Replace один раз с помощью оценщика соответствия, метода, который принимает совпадение и возвращает заменяющую строку.

Вы можете создать шаблон соответствия, взяв свой строковый массив и вызвав Regex.Escape для каждого элемента, затем присоедините его к String.Join, используя | как разделитель.

Ещё вопросы

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