2015-02-23 2 views
-1

Редактировать: Оказывается, мой код ниже работает, просто не при вводе значений из отладчика. Пример одиночного обратного слэша не удался при вводе из отладчика, потому что одна обратная косая черта была обработана как escape-символ, а не обратная косая черта.Использование C# regex для получения слов после одного или нескольких символов «»

Я пытаюсь получить пользовательский псевдоним из строки, которая может быть любой из следующих входов:

  1. псевдоним
  2. домен
  3. \ псевдоним
  4. домен \\ псевдоним

Моего C# шаблон регулярного выражения выглядит следующим образом:

string pattern = @"(.*\\)(.*)"; 

И я делаю это в коде:

string alias = Regex.Replace(input, pattern, "$2", RegexOptions.None); 

Это возвращает:

  1. псевдоним
  2. домен
  3. \ псевдоним
  4. псевдоним

Обратите внимание, что он не работает для # 2 (с одним «\»). Каково решение этой задачи?

Вот точный код метода (извините, если это не формат хорошо):

private string[] CreateEmailArrayFromString(string p) 
{ 
    string[] address = new string[] { string.Empty }; 
    if (p != null) 
    { 
     address = p.Split(new char[] { ';', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); 
     for (int i = 0; i < address.Length; i++) 
     { 
      if (address[i].Contains("@") == false) 
      { 
       string pattern = @"(.*\\)(.*)"; 
       address[i] = Regex.Replace(address[i], pattern, "$2", RegexOptions.None); 
       address[i] = string.Concat(address[i].Trim(), "@mycompany.com"); 
      } 
     } 
    } 
    return address; 
} 
+3

Я просто запустил это, и я получаю «псевдоним» для всех трех. Есть ли что-то еще для кода? – Jacob

+1

Считаете ли вы использование 'input.Split ('\\'). Last()' вместо регулярного выражения? –

+0

Как сказал @Jacob, это работает (переход на вкладку «контекст»): [буря регулярного выражения] (http://regexstorm.net/tester?p= (. *% 5c% 5c) (. *) & I = alias % 0d% 0adomain% 5calias% 0d% 0adomain% 5c% 5calias% 0d% 0a & r =% 242) – Kobi

ответ

0

Это решение LINQ, который работает для всех трех случаев:

string str = @"domain\\alias"; 
string str2 = @"domain\alias"; 
string str3 = @"alias"; 

string res = new string(str.Reverse().TakeWhile(c => c != '\\').Reverse().ToArray()); 
+0

Он по-прежнему работает без условного. –

+0

@AndrewMorton - Спасибо, исправлено –

+0

Я получаю сообщение об ошибке по адресу [i] .Reverse <- не распознанный метод в массиве. – AgentExe

1

Это код делает работы:

string pattern = @"(.*\\)(.*)"; 
string alias = Regex.Replace(input, pattern, "$2", RegexOptions.None); 

Это, вероятно, не будет работать, если вход поступает из отладчика. Это то, что происходило в моем случае.

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