2013-07-11 5 views
3

Я создаю своего рода фильтр для сообщения, но столкнулся с некоторыми проблемами с фактической заменой частей слова.Regex Filter in C#

Рассмотрев вопрос this, я попытался сделать это почти так, как они. Тем не менее, я хочу работать с несколькими возможными словами, чтобы фильтровать, и я хочу, чтобы у каждого было другое дело. Казалось бы, словарь отлично подходит для этого. Однако это не работает.

 Dictionary<string, string> filterWords = new Dictionary<string, string> 
     { 
      {"lol", "LAUGH OUT LOUD"}, 
      {"wtf", "WOW THAT'S FANTASTIC"}, 
     }; 

     foreach (KeyValuePair<string, string> word in filterWords) 
     { 
      Regex r = new Regex(@"\b" + word.Key + "\b"); 
      message = r.Replace(message, word.Value); 
     } 

Я не вижу ничего действительно неправильно с кодом, но на самом деле не заменяет слова, и я озадачен о том, как это исправить.

+0

Какое сообщение об ошибке? – banging

+0

'Я в тупик, как исправить это.' Как исправить * какую проблему *? – I4V

+4

Ваш второй \ b нужен @? –

ответ

6

Две проблемы, которые я вижу с этим кодом является то, что он рассматривает сообщение с учетом регистра, и что вы пропустили @ перед вторым "\b" буквального, что делает "\b" в забой, не истекшим слова маркера.

Попробуйте заменить

Regex r = new Regex(@"\b" + word.Key + "\b"); 

с

Regex r = new Regex(@"\b" + word.Key + @"\b", RegexOptions.IgnoreCase); 

остальная часть кода должна работать нормально.

Возможно, вы захотите немного оптимизировать свой код путем компиляции ваших регулярных выражений. Кроме того, поскольку filterWords на самом деле не Dictionary, вы можете использовать List<Tuple<Regex,string>>.

+0

Обычно вам повезло, когда вы забываете избежать символа и получить неподтвержденную ошибку компиляции escape-последовательности, но если вы выберете один из них: http://blogs.msdn.com/b/csharpfaq/archive/2004/03/ 12/what-character-escape-sequence-are-available.aspx, он будет компилировать только штраф – Gray

+1

'@" \\ b "' и '' \\ b "' разные, соответствующие '\\ b' и' \ b' соответственно. Я думаю, вы хотите '@" \ b "' или '" \\ b "', которые анализируются на '\ b', который анализирует границу слова регулярного выражения. –

+0

@TimS. Исправлено ... – dasblinkenlight