Поиск по этому блогу

воскресенье, 22 апреля 2012 г.

Регулярные выражения в C# часть 1

Регулярные выражения предоставляют мощный, гибкий и эффективный метод обработки текста. Обширные возможности сопоставления шаблонов, предоставляемые регулярными выражениями, позволяют быстро анализировать большие объемы текста, отыскивая в них определенные символьные шаблоны, проверять текст на соответствие определенным заранее шаблонам (например, формату адреса электронной почты), извлекать, изменять, заменять или удалять подстроки текста, а также добавлять извлеченные строки в коллекцию для формирования отчетов.
Ну это выписка с http://msdn.microsoft.com/ru-ru/library/hs600312.aspx.
Цель данного поста - записать для себя памятку по регулярным выражениям в 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);


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

^ - указывает на то, что поиск должен начинаться с начала строки, например шаблон (@”^не”) найдет “не” в строке, если она начинается с него: “Не может быть совсем не может быть не”.
$ -указывает на то что поиск должен производиться в конце строки, шаблон (@”не$”) найдет “не” в той же самой строке, только если она заканчивается им.
{n} – указывает точное число вхождений в строку, например шаблон (@"не{2}") найдет слово “нее” в строке.
{n,} – указывает число вхождений не менее n, т.е. шаблон (@"не{2,}") найдет слова “нее”, “неее” и т.д.
{n,m} – указывает число вхождений-n и количество символов вхождения-m, то есть шаблон (@"не{2,4}") найдет все слова где количество букв “е” больше 2, но определит только количество букв ”е” равное 4. Т.е. в слове “нееееееееее” он найдет только “нееее”.
+ - Соответствует 1 или более предшествующих выражений. Например, "не+" соответствует "не" и "нее", но не соответствует "н".
*- Соответствует 0 или более вхождений предшествующего выражения. Например, 'не*' соответствует "н" и "нее".
? - Соответствует 0 или 1 предшествующих выражений. Например, 'бы(ло)?' соответствует "бы" в "бы" или "было".
В квадратных скобках можно указать диапазон букв или цифр для поиска, например [A-Z] или [0-9]
[abc] Любой из перечисленных в скобках символов. Используя тире можно указать диапазон символов, например,  [a-f] - то же самое, что [abcdef] .
[^abc] -
Любой символ, кроме перечисленных в скобках.
\d -
Цифра. Эквивалентно [0-9] .
\D -
Любой символ, кроме цифр. Эквивалентно [^0-9] .
\w -
Цифра, буква (латинский алфавит) или знак подчеркивания. Эквивалентно [0-9a-zA-Z_] .
\W -
Любой символ, кроме цифр, букв (латинский алфавит) и знака подчеркивания. Эквивалентно [^0-9a-zA-Z_] .
\s -
Пробельный символ (пробел, табуляция, перевод строки и т. п.).
\S -
Любой символ, кроме пробельных.
. -
Любой символ, кроме перевода строки. Для поиска любого символа, включая перевод строки, можно использовать конструкцию [\s\S] .
\ -
Экранирование. Например, символ "." является спецсимволом, если же нужно чтобы он воспринимался буквально, т. е. означал именно точку, то нужно записать так: "\." .
a|b -
Условие "или" (a или b). Так как в данном случае с обеих сторон разделителя ровно по одному символу, то можно заменить на [ab] .
(abc) - Подвыражение. Соответствующий подвыражению текст запоминается отдельно от общего результата.
(?:abc) -
Подвыражение. Соответствующий подвыражению текст не запоминается. Используется для группировки частей образца, например, /ко(?:т|шка)/ - то же самое, что /кот|кошка/.
(?=abc) -
Поиск с "заглядыванием вперед", срабатывает если соответствие найдено. Например, /Windows (?=95|98|NT|2000)/ найдет "Windows " в строке "Windows 98", но ничего не найдет в строке "Windows 3.1". После сопоставления поиск продолжается с позиции, следующей за найденным соответствием, без учета заглядывания вперед.
(?!abc) -
Поиск с "заглядыванием вперед", срабатывает если соответствие не найдено. Например, /Windows (?=95|98|NT|2000)/ найдет "Windows " в строке "Windows 3.1", но ничего не найдет в строке "Windows 98". После сопоставления поиск продолжается с позиции, следующей за найденным соответствием, без учета заглядывания вперед.
\0 -
Символ NUL.
\t -
Символ табуляции.
\v -
Символ вертикальной табуляции.
\r -
Символ возврата каретки.
\n -
Символ перевода строки.
\f -
Символ перевода формата.
\b -
Граница слова, т. е. позиция между словом и пробелом или переводом строки.
\B -
Любая позиция кроме границы слова.
\xhh -
Символ с кодом hh (2 шестнадцатиричных цифры).
\uhhhh -
Символ с кодом hh (4 шестнадцатиричных цифры).



Далее приведен пример для поиска времени в формате 00:00:00 и показана некоторая оптимизация кода.
Пример:

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());



4 комментария:

  1. Спасибо, регулярные выражения довольно сложны для понимания, поэтому удобно использовать Вашу страницу как мини-справочник.

    ОтветитьУдалить
    Ответы
    1. Я рад, что моя страница оказалась вам полезной.

      Удалить
  2. Спасибо! Долго искала что-то вразумительное. Нашла :)

    ОтветитьУдалить