Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > Общие вопросы .NET
Регистрация

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

Ответ
 
Опции темы
Старый 01.11.2012, 12:12   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Репутация: 19
По умолчанию 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,639
Репутация: 3613
По умолчанию

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

Цитата:
Сообщение от 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рассчитать общие затраты на используемые материалы. Катя369919407 Паскаль 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 15.11.2009 00:42


22:01.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru