Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 1265, средняя оценка - 4.60
Filislav
328 / 274 / 14
Регистрация: 02.09.2010
Сообщений: 547
#1

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

18.02.2011, 13:09. Просмотров 178917. Ответов 4
Метки faq (Все метки)

Как и обещал, выкладываю свой FAQ по Regex для тех кто только начинает с ним знакомиться. По мере углубления своих знаний готов продолжить работу над ним. Если администрации он покажется полезным то можно вынести тему наверх. Надеюсь что кому-то он поможет, мне бы, во всяком случае, для старта он очень пригодился бы.

От tezaurismosisПримечание для пользователей
Если у вас есть замечание или дополнение по поводу данной темы - пишите сюда.
Если же у вас появился вопрос, касающийся работы с регулярными выражениями, вам стоит создать отдельную тему в разделе.


Regex FAQ.


Регулярные выражения – это один из способов поиска подстрок (соответствий) в строках. Осуществляется это с помощью просмотра строки в поисках некоторого шаблона.
Для того чтобы использовать Regex в своих программах необходимо в список используемых пространств имен добавить:
using System.Text.RegularExpressions;
Далее, в коде самой программы необходимо создать экземпляр Regex:
Regex newReg = new Regex(pattern,options);
Все найденные соответствия в тексте помещаются в тип MatchCollection
MatchCollection matches;
И далее в этот объект поместить текст, в котором необходимо произвести поиск:
matches = newReg.Matches(text);
В результате в matches появляются все результаты парсинга. Мы можем посмотреть сколько их (matches.Count), можем узнать значение конкретного элемента (matches[N].Value)
pattern – образец или условие для поиска, например, если необходимо найти слово“не” в строке “не может быть”, то pattern для поискабудет выглядеть так: @"не". В простейшем случае, можно обойтись без условия поиска, тогда найдено будет значение точно повторяющее pattern. Можно получить как значение найденного совпадения так и их количество, как видно из примера ниже.
C#
1
2
3
4
5
6
7
8
9
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#
1
2
3
4
5
6
7
8
9
10
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#
1
2
3
4
5
6
7
8
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());
82
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2011, 13:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Регулярные выражения FAQ (C#):

Регулярные выражения - вывод сообщения об ошибке при нахождении в строке выражения, начинающегося с цифры - C#
Нужно чтобы при нахождении в строке выражения начинающегося с цифры появлялось сообщение об ошибке,например если ввести :2a,то будет...

Регулярные выражения - C#
Помогите, пожалуйста, реализовать решение задания с использованием методов класса Regex Задание: Выяснить, верно ли, что среди символов...

Регулярные выражения - C#
Нужно в выражении типу =А1+В78/7+3, заменить все ссылки на ячейки на значение в ячейки. Как написать первые две переменные? string...

Регулярные выражения - C#
Здравствуйте! Стоит такая задача - разбиение адреса сайта на части. Адрес имеет вид имеет вид - xx-x . xx-x . ... .xx. Например...

Регулярные выражения - C#
подскажите пожалуйста, как при помощи регулярных выражений выделить строку, начало которой &quot;Фамилия:&quot;, а конец &quot;.&quot;, но между началом и...

Регулярные выражения - C#
Привет! Вот только позавчера сел за C#. Столкнулся с проблемой реализации одного момента. Суть такова: с клавиатуры вводится некая...

4
Crudelis
Шаровик затейник
677 / 426 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
18.02.2011, 14:02 #2
Надеюсь автор не будет против, но уверен что информация будет полезна для новичков, дополню тему

[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 шестнадцатиричных цифры).
67
Crudelis
Шаровик затейник
677 / 426 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
14.03.2011, 12:39 #3
Классы пространства имен System.Text.RegularExpressions

Capture - Представляет результаты из отдельной записи части выраже-
ния. Capture представляет одну подстроку для отдельной успешной записи.

CaptureCollection - Представляет последовательность подстрок записи.

CaptureCollection возвращает набор записей, сделанных одной группой записи.

Group - Group представляет результаты отдельной группы записи.
Группа записи может записать ноль, одну или более строк в одно совпадение из-за кванторов, таким образом Group предоставляет коллекцию объектов Capture.

GroupCollection - Представляет коллекцию групп записи. GroupCollection возвращает набор групп записи в одном совпадении.

Match - Представляет результаты из отдельного совпадения регулярного выражения.

MatchCollection - Представляет набор успешных совпадений, обнаруженных путем итеративного применения шаблона регулярного выражения к входной строке.

Regex - Представляет постоянное регулярное выражение.

RegexCompilationInfo - Представляет сведения о регулярном выражении, используемые для компиляции регулярного выражения в отдельную сборку.

RegexRunner - Класс RegexRunner является базовым классом для скомпилированных регулярных выражений.

RegexRunnerFactory - Создает класс RegexRunner для скомпилированного регулярного выражения.
28
fiphiker
86 / 57 / 4
Регистрация: 08.03.2011
Сообщений: 546
30.01.2012, 11:55 #4
Вот еще 2 сайта для тестирования регулярок, а также разнообразные шаблоны
http://gskinner.com/RegExr/
http://regexlib.com/(A(Wcv_JS2eOyYHW...ookieSupport=1
А также табличка
22
Вложения
Тип файла: pdf regexp.pdf (95.5 Кб, 3332 просмотров)
Karrimdra
31 / 34 / 0
Регистрация: 23.01.2013
Сообщений: 17
23.01.2013, 14:56 #5
Посмотрел первую и вторую ссылку для проверки регулярных выражений. Обе не понравились.
Потратил драгоценное время и накидал маленькую програмку для проверки регулярных выражений.
Прикладываю вместе с исходниками кому надо.

PS Програмка на C# так что все выражения что в ней работают, работают в C#
24
Вложения
Тип файла: rar Проверка регулярных выражений.rar (5.7 Кб, 1204 просмотров)
23.01.2013, 14:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2013, 14:56
Привет! Вот еще темы с ответами:

Регулярные выражения - C#
private void button4_Click(object sender, EventArgs e) { string a; //текст для поиска a...

Регулярные выражения - C#
Приветствую, форумчане. Разрабатываю программу, позволяющую с помощью протокола http определить текущий курс доллара. Возникла...

Регулярные выражения - C#
Regex regex = new Regex(); Помогите, пожалуйста, написать регулярное выражение.

Регулярные выражения в c# - C#
Взять в скобки поле комментарии, не являющееся фамилией, именем и отчеством пользователя. Как это делается, помогите?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru