Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2012, 12:12   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию Pattern'ы, используемые классом Regex

Имеется строковый HashSet следующего абстрактного вида:
Код:
private static readonly HashSet<String> statusHashSet=new HashSet<String> {"плохо", "нормально", "хорошо", "замечательно"};
и некоторая строка, которую задает пользователь, допустим:
Код:
String input="нормально ты работаешь";
Необходимо установить начинается ли строка input на одно из выражений HashSet'а statusHashSet. Циклы для проверки городить не особо хочется, хотя это и самый простой вариант, решил использовать класс Regex и регулярные выражения. Читаю MSDN и смотрю пример:
Код:
class Example 
{
   static void Main() 
   {
      string text = "One car red car blue car";
      string pat = @"(\w+)\s+(car)";

      // Instantiate the regular expression object.
      Regex r = new Regex(pat, RegexOptions.IgnoreCase);

      // Match the regular expression pattern against a text string.
      Match m = r.Match(text);
      int matchCount = 0;
      while (m.Success) 
      {
         Console.WriteLine("Match"+ (++matchCount));
         for (int i = 1; i <= 2; i++) 
         {
            Group g = m.Groups[i];
            Console.WriteLine("Group"+i+"='" + g + "'");
            CaptureCollection cc = g.Captures;
            for (int j = 0; j < cc.Count; j++) 
            {
               Capture c = cc[j];
               System.Console.WriteLine("Capture"+j+"='" + c + "', Position="+c.Index);
            }
         }
         m = m.NextMatch();
      }
   }
}
// This example displays the following output:
//       Match1
//       Group1='One'
//       Capture0='One', Position=0
//       Group2='car'
//       Capture0='car', Position=4
//       Match2
//       Group1='red'
//       Capture0='red', Position=8
//       Group2='car'
//       Capture0='car', Position=12
//       Match3
//       Group1='blue'
//       Capture0='blue', Position=16
//       Group2='car'
//       Capture0='car', Position=21
Но не могу понять каким образом сформировать pattern, что значят некоторые символы в нем ("w+", "s+" и т.д.). Ни мог бы кто-нибудь разъяснить что это, каким образом можно сформировать pattern (каков его синтаксис)? Заранее всем спасибо
Привел ссылки на MSDN, хотя сам использую точно такие же классы из Mono/Gtk#, чтобы было проще
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 01.11.2012, 12:19   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

И какой смысл ухудшать код по всем статьям регулярками, когда тут простым циклом в 2 строки всё решается?
pu4koff вне форума Ответить с цитированием
Старый 01.11.2012, 13:48   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
И какой смысл ухудшать код по всем статьям регулярками, когда тут простым циклом в 2 строки всё решается?
Думаю, что применение такой технологии сделает код более читабельным - гораздо лицеприятнее вызвать один стандартный метод, чем писать цикл и использовать StartWith. Сперва хотел в своем классе реализовать простой дву-строчный метод, но потом подумал и решил, что использование стандартных средств языка более предпочтительно, к тому же отлаживать проще. В классе Regex есть метод IsMatch, который проверяет входит ли указанное регулярное выражение в исследуемую строку - если бы можно было провести проверку не в общем формате, а в частном (начинается с...), то было бы вообще замечательно и как подозреваю, формат pattern'а как раз и позволяет задать именно такое сравнение.
Если же поиски успехом не увенчаются, напишу простецкий метод-расширение для String.StartWith из разряда:
Код:
protected Boolean StartWith(String Value, String[] StartOfString)
{
foreach(String str in StartOfString)
{
if(Value.StartWith(str))
{
return true;
}
}
return false;
}
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 01.11.2012 в 13:56.
Mixim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рассчитать общие затраты на используемые материалы. Катя369919407 Паскаль, Turbo Pascal, PascalABC.NET 7 30.01.2012 22:04
Сколько байт занимают переменные, используемые в программе Эндрю Помощь студентам 2 10.05.2011 13:36
C# и regex Vigo_Alex Помощь студентам 0 12.10.2010 02:26
Regex Cpluser Общие вопросы .NET 1 27.04.2010 14:52
Regex CWD Общие вопросы .NET 6 14.11.2009 23:42