2016-01-21 7 views
3
string emailBody = " holla holla testing is for NewFinancial History:\"xyz\" dsd NewFinancial History:\"abc\" NewEBTDI$:\"abc\" dsds "; 

    emailBody = string.Join(" ", Regex.Split(emailBody.Trim(), @"(?:\r\n|\n|\r)")); 
       var keys = Regex.Matches(emailBody, @"\bNew\B(.+?):", RegexOptions.Singleline).OfType<Match>().Select(m => m.Groups[0].Value.Replace(":", "")).Distinct().ToArray(); 
       foreach (string key in keys) 
       { 
        List<string> valueList = new List<string>(); 
        string regex = "" + key + ":" + "\"(?<" + GetCleanKey(key) + ">[^\"]*)\""; 

        var matches = Regex.Matches(emailBody, regex, RegexOptions.Singleline); 
        foreach (Match match in matches) 
        { 
         if (match.Success) 
         { 
          string value = match.Groups[GetCleanKey(key)].Value; 
          if (!valueList.Contains(value.Trim())) 
          { 
           valueList.Add(value.Trim()); 
          } 
         } 
        } 

public string GetCleanKey(string key) 
     { 
      return key.Replace(" ", "").Replace("-", "").Replace("#", "").Replace("$", "").Replace("*", "").Replace("!", "").Replace("@", "") 
       .Replace("%", "").Replace("^", "").Replace("&", "").Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "").Replace("?", "") 
       .Replace("<", "").Replace(">", "").Replace("'", "").Replace(";", "").Replace("/", "").Replace("\"", "").Replace("+", "").Replace("~", "").Replace("`", "") 
       .Replace("{", "").Replace("}", "").Replace("+", "").Replace("|", ""); 
     } 

В моем коде выше я пытаюсь получить значение рядом с NewEBTDI$:, который "abc".Найти конкретное слово в Изотерм ех вместе с особым характером

Когда я включаю $ знак в шаблоне, он не ищет значение рядом с именем поля.

Если удаляется $, а один указывается NewEBTDI, тогда он выполняет поиск значений.

Я хочу найти значение вместе с знаком $.

+0

Правильно расположите свой код. Это невозможно прочитать. –

+0

«$» имеет особое значение в Regex. Побег с помощью \. Но в вашем случае вам придется выполнить метод String.Replace(), потому что генерируется ваше регулярное выражение. У вас может быть и другой особый характер ... –

ответ

5

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

string regex = "" + Regex.Escape(key) + ":" + "\"(?<" + Regex.Escape(GetCleanKey(key)) 
       + ">[^\"]*)\""; 

или

string regex = String.Format("{0}:\"(?<{1}>[^\"]*)\"", 
          Regex.Escape(key), 
          Regex.Escape(GetCleanKey(key))); 

или с VS 2015, используя интерполяцию строки:

string regex = $"{Regex.Escape(key)}:\"(?<{Regex.Escape(GetCleanKey(key))}>[^\"]*)\""; 

(это выглядит лучше, чем в действительности, потому что C# редактор цвета струнные части и встроенные выражения C# по-разному.)

+0

Я не знал о Regex.Escape! –

+0

Спасибо, это сработало для меня !!! –

1

Непонятно, какова конечная цель, но $ в шаблоне - это удержание шаблона, означающее либо конец линии, либо конец буфера в зависимости от того, установлен ли MultiLine или нет.

Почему бы не просто захватить текст перед : в названный захват? Затем извлечь цитируемое значение операции, такие как:

var data = "...is for NewFinancial History:\"xyz\" dsd NewFinancial History:\"abc\" NewEBTDI$:\"abc\" dsds"; 

var pattern = @" 
(?<New>New[^:]+)  # Capture all items after `New` that is *not* (`^`) a `:`, one or more. 
:      # actual `:` 
\x22     # actual quote character begin anchor 
(?<InQuotes>[^\x22]+) # text that is not a quote, one or more 
\x22     # actual quote ending anchor 
"; 

// IgnorePatternWhitespace allows us to comment the pattern. Does not affect processing. 
Regex.Matches(data, pattern, RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture) 
    .OfType<Match>() 
    .Select(mt => new 
    { 
     NewText = mt.Groups["New"].Value, 
     Text = mt.Groups["InQuotes"].Value 
    }); 

Результат

enter image description here

Примечание Я использую шестигранный побег \x22 вместо того, чтобы уйти от \" в шаблоне для облегчения работы с ним. Потому что он обходит компилятором C# преждевременно, избегая прокрутки шаблона, который должен оставаться неповрежденным.

+0

Спасибо, это сработало для меня !!! –

Смежные вопросы