Вверх ↑
Пакеты 
HiAsm4
Windows 
Компоненты 
Cтpoки 
RegExpr - RegularExpressions

RegularExpressions
== RegExpr или Регулярные выражения ==
Введение
   RegExpr (Регулярные выражения) - специальный язык для поиска подстрок в заданной строке, основанный на использовании метасимволов.
Отличия от компонента StrMask
   Основное отличие в том, что в RegExpr находятся вхождения подстроки по маске, а StrMask сравнивает строку с маской (то есть, грубо говоря, RegExpr что-то среднее между компонентом Find и StrMask). Так же функционал StrMask сильно ограничен по сравнению с RegExpr. Далее о возможностях RegExpr.
Возможности RegExpr
   Первое с чего хотелось бы начать - описание метасимволов.
Возьмем пример с нашего компонента StrMask: пусть маска будет простой: "Hi*" (здесь и далее, без кавычек). Как же записать ее в RegExpr?
Обратимся к самым основным метасимволам:
СимволОписаниеПримеры
.Один любой символ.
*0 или более предшествующего выражения ".*" - 0 или более любых символов, "H*" - 0 или более букв "H"
+1 или более предшествующего выражения "As+" - соответствует As, Ass..., но не A
?0 или 1 предшествующего выражения "Hi!?" - соответствует только Hi! или Hi
\Используется для вставки мета-символа как символа подстроки (литерала), т.е значение мета-символа после "\" будет игнорироваться. !!! Если после символа "\" будет стоять не мета-символ, то специальное значение "\" игнорируется "\*" будет соответствовать символу "*" при поиске подстроки

   Теперь мы можем с легкостью переписать выражение с StrMask на RegExpr: "Hi.*". Такое выражение найдет все подстроки с начальными символами "Hi".
Позиция внутри строки
   Бывают ситуации, когда необходимо произвести поиск подстроки только в начале или в конце строки, для таких случаев существуют следующие метасимволы.
   Пусть для примера будет строка "aaa aaa", найденные подстроки будут выделены синим цветом
СинтаксисОписаниеПримерНайденные вхождения
^Поиск в начале строки^aaaa aaa
$Поиск в конце строкиa$aaa aaa
\bГраница слова\baaaa aaa
\BНе граница слова\Ba\Baaa aaa
\GПредыдущий успешный поиск\Gaaaa aaa

Наборы символов и группы
   Возьмем еще один пример маски из StrMask: "##-##-##" (запись 6-тизначного телефона). Как переписать ее на RegExpr?
   Именно для этой цели служат наборы символов. Они записываются между "[" и "]", и на месте этой записи может стоять одна из букв, перечисленных в выражении.
   Например: "[Hh][Ii].*" - такая маска найдет подстроки с началом "hi", "Hi", "HI" и "hI". Однако выражение выше показано лишь для примера, на самом деле реагирование на регистр букв можно отключить (об это ниже в разделе Модификаторы)
   Стоит отметить, что допустимо использовать в наборах диапазоны: "[0-9]" - это значит все числовые символы от 0 до 9
   Теперь мы можем переписать нашу маску телефонного номера: "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]". Не так коротко, как в StrMask, правда? О том, как укоротить мы рассмотрим ниже.
   Вставка символа "^" после "[" обозначает любые символы, кроме тех, которые между "[^" и "]". Например "[^0-9]*" найдет все строки, в которых нет чисел.

   В RegExpr возможно составлять группу. Она считается как за одно выражение и пишется между "(" и ")". Для чего же нужны группы?
   Группы позволяют записывать несколько подвыражений в одном, к примеру по выражению "тра(-?та)*" найдутся строки вида: "Тра-та-тата-та"
Поиск буквенных и численных значений
   Существуют несколько коротких спец-символов для упрощения следующих записей:
СинтаксисОписание
\sЛюбой пробельный символ
\SЛюбой НЕ пробельный символ
\dЛюбая цифра
\DЛюбая буква, кроме цифр
\wЛюбые буквы английского алфавита, цифры и "_"

Квантификаторы
   Квантификаторы позволяют указывать сколько раз повторяется предшествующее выражение. Синтаксис квантификатора такой: "{n}", где n - кол-во повторений.
   Допускается использование диапазонов: "{m,n}", где m - минимальное кол-во повторений, n - максимальное. К примеру: "{2,3}" (от 2 до 3 повторений), "{0,1}" (0 или 1). При отсутствии одной из границ она принимается за 0, т.е "{,5}" - не более 5, или "{2,}" - не менее 2.
   Символы "*", "+", "?" были введены для упрощения записи часто используемых выражений квантификации, однко их можно переписать используя квантификацию фигурными скобками.
   Если же символы "{" и "}" не образуют квантификатор, то их специальное значение игнорируется.

   Используя полученные знания, мы мжем переписать маску телефонного номера: "([\d]{2}-?){3}"
"Жадная" и "ленивая" квантификации
   Допустим вам необходимо выполнить поиск тегов в HTML-странице, в этом нам, конечно же, помогут RegExpr. Первое выражение, пришедшее на ум: <.*>. Чтож, для строки вида "text <b> text" это и правда подойдет, но вот если строка ьудет состоять более, чем из одного тега, то RegExpr нам выдаст все: от первого символа "<" до последнего ">", т.е пусть строка для поиска в ней: "<b>HiAsm</b> - программирование для <i>всех</i>". В таком случае результат поиска выражения будет всей этой строкой, отсюда и пошло название "жадный". Чтобы избежать этой проблемы можно воспользоваться двумя способами:

    1. Добавить учитывание символов, соответствующих образцу (для описанного выше случая): "<[^>]*>"
    2. Объявить квантификатор как "нежадный" (или "ленивый"): "<.*?>"
ЖадныйЛенивый
**?
++?
{m,}{m,}?

Однако использование "ленивых" квантификаторов может так же повлечь за собой и обратную проблемму - образцу будет соответствовать слишком короткая строка
Модификаторы
   Модификаторы нужны для установления некоторых опций при поиске строки, они могут быть включены в свойствак компонента или в самом выражении. В выражении используются модификаторы для установления опций для некоторой части выражения, а в свойствах - обычно для обычных случаев. Синтаксис модификатора в выражении таков: "(?<модификатор>)". Например "(?i)". Символ '-' перед модификатором означает его выключение, без '-' - включение.
МодификаторОписание
iНечувствительность выражения к регистру символов
sРежим соответствия точки символам переноса строки и возврата каретки
mСимволы ^ и $ вызывают соответствие только после и до символов новой строки при включенном модификаторе, или с началом и концом строки для выключенного
xРежим без учёта пробелов между частями регулярного выражения и позволяет использовать # для комментариев

Комментарии
   Для добавления комментариев в регулярное выражение можно использовать группы-комментарии вида (?#комментарий). Такая группа RegExpr полностью игнорируется и не проверяется на вхождение в текст. Например, выражение "А(?#тут комментарий)Б" соответствует строке АБ.
Перечисления
   Вертикальная черта позволяет перечислять допустимые варианты. К примеру выражение "абв|бвг" найдет либо абв, либо бвг.
   При этом, если должен быть выбор только части выражения, то тут нам пригодятся группы. К примеру выражение "((трам|трумс)-?)*" найдет строку вида "трамтрам-трумс-трумстрам", но не "трум-трамс"
Об авторах
Составитель статьи: Assasin
Редактировали статью: <никого>
Составлено под функционал компонента на HiAsm
Большое спасибо авторам RegExpr и HiAsm, а так же Wikipedia, откуда было взято большинство материала для Help-а
BB-code статьи для вставки
Всего комментариев: 0
(комментарии к статье еще не добавлены)
Комментарий
...