1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Скрыть объявление

Привет посетитель! У нас на форуме тебе откроются дополнительные разделы, которые скрыты от гостей! А так же ты найдёшь много полезной информации.

Регулярные выражения C#

Тема в разделе "C++ / C# / .NET", создана пользователем kick, 4 апр 2017.

  1. kick

    kick Магистр Йода Администратор

    Регистрация:
    20 янв 2015
    Сообщения:
    4.918
    Симпатии:
    3.483
    Баллы:
    6.235
    Регулярные выражения – это один из способов поиска подстрок (соответствий) в строках. Осуществляется это с помощью просмотра строки в поисках некоторого шаблона.
    Для того чтобы использовать Regex в своих программах необходимо в список используемых пространств имен добавить:
    using System.Text.RegularExpressions;
    Далее, в коде самой программы необходимо создать экземпляр Regex:
    Regex newReg = new Regex(pattern,options);
    Все найденные соответствия в тексте помещаются в тип MatchCollection
    MatchCollection matches;
    И далее в этот объект поместить текст, в котором необходимо произвести поиск:
    matches = optionRegex.Matches(text);
    В результате в matches появляются все результаты парсинга. Мы можем посмотреть сколько их (matches.Count), можем узнать значение конкретного элемента (matches[N].Value)
    pattern – образец или условие для поиска, например, если необходимо найти слово“не” в строке “не может быть”, то pattern для поискабудет выглядеть так: @"не". В простейшем случае, можно обойтись без условия поиска, тогда найдено будет значение точно повторяющее pattern. Можно получить как значение найденного совпадения так и их количество, как видно из примера ниже.

    Код C#
    Код:
    string pattern = @"не";
    string text = "не может быть";
    Regex newReg = new Regex(pattern);
    MatchCollection matches = newReg.Matches(text);
    foreach(Match mat in matches)
    {
        Console.WriteLine("Значение найденного обьекта {0}",mat.Value);
    }
    Console.WriteLine("Число найденных совпадений{0}",matches.Count);
    Теперь остановимся на условиях поиска, или options. Для начала необходимо создать условие поиска:

    RegexOptions option = RegexOptions.<условие поиска>;
    Ниже приведены условия поиска.
    IgnoreCase*– находит совпадения независимо от регистра, т.е. прописными или строчными буквами в строке написано слово.
    IgnorePatternWhitespace – устраняет из шаблона неизбежные пробелы и включает комментарии помеченные «#».
    Compiled – указывает что регулярное выражение скомпилировано в сборку. Это порождает более быстрое исполнение но увеличивает время запуска.
    CultureInvariant – указывает игнорирование региональных языковых различий.
    ExplicitCapture – указывает что единственные допустимые записи являются явно поименованными или пронумерованными группами в форме(?<name>…)
    Multiline – Многострочный режим. Изменяет значения символов “^” и“$” так что они совпадают соответственно в начале и конце каждой строки, а не только в начале и конце целой строки.
    RightToLeft – указывает что поиск будет выполнен справа на лево, а не слева на право.
    Singleline – однострочный режим.
    None – указывает на отсутствие заданных параметров.
    Пример с условиями поиска будет выглядеть так:

    Код C#
    Код:
    string pattern = @"не";
    string text = "Не может быть совсем не может быть";
    RegexOptions option=RegexOptions.IgnoreCase;
    Regex newReg = new Regex(pattern,option);
    MatchCollection matches = newReg.Matches(text);
    foreach(Match mat in matches)
    {
        Console.WriteLine("Значение найденного обьекта {0}",mat.Value);
    }
    Console.WriteLine(“Число найденных совпадений{0}”,matches.Count);
    В этом случае будет осуществлен поиск слова “не” не зависимо от того какими буквами (прописными или строчными) оно написано. И в результате будут найдены оба слова в строке. При желании и опыте, код может быть оптимизирован.*
    Используя специальные символы можно создавать более сложные шаблоны для поиска:
    ^*- указывает на то, что поиск должен начинаться с начала строки, например шаблон (@”^не”) найдет “не” в строке, если она начинается с него: “Не может быть совсем не может быть не”.
    $-указывает на то что поиск должен производиться в конце строки, шаблон (@”не$”) найдет “не” в той же самой строке, только если она заканчивается им.
    {n}– указывает точное число вхождений в строку, например шаблон (@"не{2}") найдет слово “нее” в строке.
    {n,}– указывает число вхождений не менее n, т.е. шаблон (@"не{2,}") найдет слова “нее”, “неее” и т.д.
    {n,m} – указывает число вхождений-n и количество символов вхождения-m, то есть шаблон (@"не{2,4}") найдет все слова где количество букв “е” больше 2, но определит только количество букв ”е” равное 4. Т.е. в слове “нееееееееее” он найдет только “нееее”.
    + - Соответствует 1 или более предшествующих выражений. Например, "не+" соответствует "не" и "нее", но не соответствует "н".
    * - Соответствует 0 или более вхождений предшествующего выражения. Например, 'не*' соответствует "н" и "нее".
    ? - Соответствует 0 или 1 предшествующих выражений. Например, 'бы(ло)?' соответствует "бы" в "бы" или "было".
    В квадратных скобках можно указать диапазон букв или цифр для поиска, например [A-Z] или [0-9]
    Далее приведен пример для поиска времени в формате 00:00:00 и показана некоторая оптимизация кода.
    Код C#
    Код:
    string s1 = "Не время для драконов 00:00:00";
                Regex reg = new Regex(@"[0-9]+:[0-9]+:[0-9]+",RegexOptions.IgnoreCase);
                MatchCollection mc = reg.Matches(s1);
                foreach (Match mat in mc)
                {
                    Console.WriteLine(mat.ToString());
                }
                Console.WriteLine(mc.Count.ToString());
     
Похожие темы
  1. *Immortal Pony*
    Ответов:
    0
    Просмотров:
    4.722
Загрузка...