Регулярные выражения
Регулярные выражения ("регэкспы", от англ. Regular Expressions) - мощное средство составления шаблонов, с помощью которых в заданном тексте может проводиться поиск и сопоставление символов любой сложности.
Как составляется такой шаблон? Для этого используются специальные символы, метасимволы и классы (наборы) символов. Регулярное выражение - это простая строка и любые символы в этой строке, которые не являются специальными (зарезервированными), считаются обычными символами.
Служебные символы делятся на три класса:
Любое выражение можно сгруппировать (заключить в скобки) и применить оператор ко всей группе.
Синтаксис регулярных выражений, использующийся в nnCron, совпадает с синтаксисом регулярных выражений языка Perl. Небольшие отличия есть только в некоторых расширенных специфических операторах.
Все регэкспы должны заключаться в прямые слэши (/.../). После конечного слэша могут идти параметры:
| /.../i | - не различать регистр. |
| /.../x | - игнорировать пробелы и переводы строк (для удобства). |
| /.../s | - считать регэксп одной единственной строкой (трактовать спецсимвол . (точка) как "любой символ, в том числе и символ перевода строки"). |
Примеры:
\ совпадет только со словом 'Valery' /Valery/ \ совпадет со словами 'VALERY', 'valery', 'Valery' и т. д. /Valery/i \ совпадет с 'foobar', 'foobar barfoo' /foobar/ \ совпадет с 'foobar', 'FOOBAR', 'foobar and two other foos' / FOO bar /ix \ совпадет с 'Valery%crlf%Kondakoff' /Valery.*Kondakoff/s
Каждый символ регулярного выражения последовательно сравнивается с проверяемой строкой. Все, что не является указанными ниже спецсимволами или операторами, воспринимается, как обычный символ, рассматриваемый на простое совпадение.
| ^ | Начало строки |
| $ | Конец строки |
| . | Любой символ кроме переводов строки (без параметра /.../s) |
| [ ... ] |
Любой из перечисленного набора символов. Внутри квадратных скобок не
работают другие операторы, но можно пользоваться метасимволами. |
| [^ ... ] | Ни один из перечисленного набора символов. Внутри квадратных скобок не
работают другие операторы, но можно пользоваться метасимволами. С помощью дефиса можно указывать наборы символов: от первого до последнего. Например, [^0-9] означает любой символы, кроме 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. |
| \# |
Следующий за слэшем символ # (кроме a-z и 0-9). |
| \b | Начало слова |
| \B | Конец слова |
| \xNN | NN - шестнадцатеричный код ASCII-символа (\x20 - пробел, \x4A - J, \x6A - j и т. д.) |
| \n | 0x10 (lf) |
| \r | 0x13 (cr) |
| \t | 0x09 (tab) |
| \s | Пробел (tab/space/cr/lf) |
| \S | Не пробел |
| \w | Символ слова (буквы, цифры, _) |
| \W | Символ не-слова |
| \d | Число |
| \D | Не число |
| \u | Символ в верхнем регистре |
| \l | В нижнем |
Примеры:
\ совпадает со словом 'help' с точкой /help\./ \ совпадает со словами 'cats', 'cars' и т. д. /ca.s/ \ совпадает со словами 'testing', 'tester', но не 'the test' /^test/ \ совпадает с выражением 'see me', но не с 'meter' или 'me and you' /me$/ \ совпадает с одной (латинской) гласной буквой /[aeiou]/ \ совпадает с одной буквой или цифрой /[a-z0-9]/
\ совпадает с 'footer', 'footing', 'a foot', но не с 'afoot' /\bfoot/ \ совпадает с 'afoot', 'foot.' (точка не считается частью слова) \ не совпадает с 'footing' /foot\B/ \ совпадает со словом 'foot' целиком /\bfoot\B/ \ совпадает со словами 'q2w', 'r5t' и т. д. /\D\d\D/
В отличии от обычных символов эти классы не совместимы с перловыми:
| \N | Ссылка внутри регэкспа на его же разобранную скобку, число N - номер нужной группы (скобки). Этот оператор работает с некоторыми ограничениями на тип ссылаемого блока - он работает, только если в ссылаемой скобке нет операторов повторения. |
Пример:
\ совпадает с фразами 'man to man', ' \ hand to hand', '100 to 100' и т. д. (\b\w+\B) to \1
Операторы не могут применяться сами по себе, без указания символа, на который они действуют. Оператор действует на определенный перед ним символ (мета или обычный). Если какое-то выражение заключено в скобки, после которых стоит оператор, то он действует на всю скобку.
| ( ... ) | Сгруппировать символы в один паттерн и запомнить |
| | | Предыдущий или следующий паттерн (логическое "ИЛИ") |
| * | Ноль или больше раз |
| + | Один или больше раз |
| ? | 0 или 1 раз предыдущая маска |
| {n} | Повторять n раз |
| {n,} | Повторять n или больше раз |
| {n,m} | Повторять от n до m раз |
Примеры:
\ совпадает со словами 'cat' или 'mouse'
/(cat)|(mouse)/
\ совпадает со словами 'dogs', 'doggie'
/dog(s|gie)/
\ совпадает с 'ma', 'maaa', 'maaaaaaa'
/ma+/
\ совпадает с 'm', 'maaa'
/ma*/
\ совпадает с 'yada yada yada'
/(yada ){2,}/
\ совпадает с 'fooandbar', 'foobar'
/foo(and)?bar/
Если после оператора добавить ?, то он превращается из жадного в нежадный. К примеру жадный * будет нежадным после замены его на *?. Жадные операторы производят максимальный захват в строке, а нежадные захватывают по минимуму.
| ?#N | Это оператор "просмотра назад". N - число символов для просмотра. |
| ?~N | Отрицание просмотра назад. |
| ?= | Просмотр вперед. |
| ?! | Отрицание просмотра вперед. |
Заметьте, что хотя последние два оператора существуют и в перле, в нем они записываются в виде (?=foobar). В nnCron оператор выглядит как (foobar)?=.
Примеры:
\ совпадет с любым словом, после которого знак табуляции \ при этом сам знак табуляции не войдет в число совпавших символов /\w+(\t)?=/ \ совпадет с любым появлением 'foo', которое не продолжается 'bar' /foo(bar)?!/ \ совпадет с любым появлением 'bar', которому предшествует 'foo' /(foo)?#3bar/
Еще немного примеров:
\ совпадет с "foobar", "bar" /(foo)?bar/ \ совпадет _только_ с "foobar" /^foobar$/ \ совпадет с "foobar", "for", "far" /f[obar]+r/ \ задает любое число с десятичной запятой /([\d\.])+/ \ совпадет с "foofoofoobarfoobar", "bar" /((foo)|(bar))+/
![]()