| RegExpr | - RegularExpressions |
RegularExpressions
== RegExpr или Регулярные выражения ==
Введение
RegExpr (Регулярные выражения) - специальный язык для поиска подстрок в заданной строке, основанный на использовании метасимволов.
Отличия от компонента StrMask
Основное отличие в том, что в RegExpr находятся вхождения подстроки по маске, а StrMask сравнивает строку с маской (то есть, грубо говоря, RegExpr что-то среднее между компонентом Find и StrMask). Так же функционал StrMask сильно ограничен по сравнению с RegExpr. Далее о возможностях RegExpr.
Возможности RegExpr
Первое с чего хотелось бы начать - описание метасимволов.
Возьмем пример с нашего компонента StrMask: пусть маска будет простой: "Hi*" (здесь и далее, без кавычек). Как же записать ее в RegExpr?
Обратимся к самым основным метасимволам:
Теперь мы можем с легкостью переписать выражение с StrMask на RegExpr: "Hi.*". Такое выражение найдет все подстроки с начальными символами "Hi".
Возьмем пример с нашего компонента StrMask: пусть маска будет простой: "Hi*" (здесь и далее, без кавычек). Как же записать ее в RegExpr?
Обратимся к самым основным метасимволам:
Символ | Описание | Примеры |
. | Один любой символ | . |
* | 0 или более предшествующего выражения | ".*" - 0 или более любых символов, "H*" - 0 или более букв "H" |
+ | 1 или более предшествующего выражения | "As+" - соответствует As, Ass..., но не A |
? | 0 или 1 предшествующего выражения | "Hi!?" - соответствует только Hi! или Hi |
\ | Используется для вставки мета-символа как символа подстроки (литерала), т.е значение мета-символа после "\" будет игнорироваться. !!! Если после символа "\" будет стоять не мета-символ, то специальное значение "\" игнорируется | "\*" будет соответствовать символу "*" при поиске подстроки |
Теперь мы можем с легкостью переписать выражение с StrMask на RegExpr: "Hi.*". Такое выражение найдет все подстроки с начальными символами "Hi".
Позиция внутри строки
Бывают ситуации, когда необходимо произвести поиск подстроки только в начале или в конце строки, для таких случаев существуют следующие метасимволы.
Пусть для примера будет строка "aaa aaa", найденные подстроки будут выделены синим цветом
Пусть для примера будет строка "aaa aaa", найденные подстроки будут выделены синим цветом
Синтаксис | Описание | Пример | Найденные вхождения |
^ | Поиск в начале строки | ^a | aaa aaa |
$ | Поиск в конце строки | a$ | aaa aaa |
\b | Граница слова | \ba | aaa aaa |
\B | Не граница слова | \Ba\B | aaa aaa |
\G | Предыдущий успешный поиск | \Ga | aaa 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 возможно составлять группу. Она считается как за одно выражение и пишется между "(" и ")". Для чего же нужны группы?
Группы позволяют записывать несколько подвыражений в одном, к примеру по выражению "тра(-?та)*" найдутся строки вида: "Тра-та-тата-та"
Именно для этой цели служат наборы символов. Они записываются между "[" и "]", и на месте этой записи может стоять одна из букв, перечисленных в выражении.
Например: "[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}"
Допускается использование диапазонов: "{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-а
Редактировали статью: <никого>
Составлено под функционал компонента на HiAsm
Большое спасибо авторам RegExpr и HiAsm, а так же Wikipedia, откуда было взято большинство материала для Help-а
BB-code статьи для вставки
Всего комментариев: 0
(комментарии к статье еще не добавлены)