2013-03-08 2 views
3

Это своего рода улучшение моего предыдущего вопроса: c# generate random string based on patternRegex - Улучшение поиска и добавить третью группу

У меня есть код, как показано ниже:

class Generator 
{ 
    private static readonly Random R = new Random(); 
    private static readonly char[] L = { 'a', 'b', 'c', 'd', 'e' }; 
    private static readonly char[] U = { 'A', 'B', 'C', 'D', 'E' }; 
    private static readonly char[] S = { '!', '@', '#', '$', '%' }; 

    public static string FromPattern(string pattern) 
    { 
     return Regex.Replace(pattern, @"\[([Ccds])(?::([\d]+))?\]", ReplaceSingleMatch); 
    } 

    private static string ReplaceSingleMatch(Match m) 
    { 
     int length; 
     if (!int.TryParse(m.Groups[2].Value, out length)) 
      length = 1; 

     var output = new StringBuilder(); 
     while (output.Length != length) 
     { 
      switch (m.Groups[1].Value) 
      { 
       case "d"://digits 
        output.Append(R.Next(0, 9)); 
        break; 
       case "c"://lowercase char 
        output.Append(L[R.Next(L.Length)]); 
        break; 
       case "C"://uppercase char 
        output.Append(U[R.Next(U.Length)]); 
        break; 
       case "s"://special char 
        output.Append(S[R.Next(S.Length)]); 
        break; 
      } 
     } 
     return output.ToString(); 
    } 
} 

Используя выше я могу написать:

Generator.FromPattern("ID: [d:3][c:2]#[C][s:2]") 

И я получу выходной образец как: ID: 263ac#D$!

Так что когда я вхожу [d] Я получаю одну цифру, если я вхожу [d:5] Я получаю 5 цифр.

Что бы я хотел добавить, это диапазон, поэтому, когда я ввожу [d:2-5], я получаю случайным образом от 2 до 5 случайных цифр.

Моя самая большая проблема в том, регулярное выражение, остальное легко :)

Мне нужно регулярное выражение для поиска ниже групп:

  • [d],
  • [d:3] (это должно быть число после двоеточия),
  • [d:2-5] (два числа, разделенные тире)

Любые предложения об улучшениях приветствуются!

ответ

1

Удивительный инструмент для регулярных выражений: http://www.ultrapico.com/Expresso.htm

Вот выражение, которое я придумал (с именованными группами захвата):

\[(?<type>[Ccds])(:(?<a>[\d]+)(-(?<b>[\d]+))?)?\] 

enter image description here

+0

спасибо за помощь и за ссылку, я m уже тестировал это :) – Misiu

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