Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/1366: Рейтинг темы: голосов - 1366, средняя оценка - 4.99
339 / 285 / 62
Регистрация: 02.09.2010
Сообщений: 547
1

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

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

Author24 — интернет-сервис помощи студентам
Как и обещал, выкладываю свой 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());
88
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2011, 13:09
Ответы с готовыми решениями:

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

Регулярные выражения
Mas=vasa25; Mas=soe; Mas=loa34; for (int i = 0; i &lt; Mas1.Length; i++) { ...

Регулярные выражения
Нужно получить заголовки новостей с сайта, никак не могу сделать это с помощью регулярных...

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

4
Шаровик затейник
696 / 445 / 78
Регистрация: 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 шестнадцатиричных цифры).
74
Шаровик затейник
696 / 445 / 78
Регистрация: 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 для скомпилированного регулярного выражения.
32
89 / 60 / 2
Регистрация: 08.03.2011
Сообщений: 546
30.01.2012, 11:55 4
Вот еще 2 сайта для тестирования регулярок, а также разнообразные шаблоны
http://gskinner.com/RegExr/
http://regexlib.com/(A(Wcv_JS2... eSupport=1
А также табличка
Вложения
Тип файла: pdf regexp.pdf (95.5 Кб, 3772 просмотров)
25
38 / 41 / 0
Регистрация: 23.01.2013
Сообщений: 17
23.01.2013, 14:56 5
Посмотрел первую и вторую ссылку для проверки регулярных выражений. Обе не понравились.
Потратил драгоценное время и накидал маленькую програмку для проверки регулярных выражений.
Прикладываю вместе с исходниками кому надо.

PS Програмка на C# так что все выражения что в ней работают, работают в C#
Вложения
Тип файла: rar Проверка регулярных выражений.rar (5.7 Кб, 1641 просмотров)
31
23.01.2013, 14:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2013, 14:56
Помогаю со студенческими работами здесь

Регулярные выражения
Ни как не получается разобраться с регулярным выражениями. Сколько уже читал , ни как не ложатся...

Регулярные выражения - C#
привет. помогите составить верное регулярное выражение... есть строка...

Регулярные выражения
где можно про них почитать и чтобы инфа на русском была и объяснено было как для чайников

Регулярные выражения
Помогите пожалуйста написать. Дана строка, в которой содержится осмысленное текстовое сообщение....


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

Или воспользуйтесь поиском по форуму:
5
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru