Регулярные выражения библиотеки colorer

Описание

Вся работа колорера основывается на использовании регулярных выражений - они являются базовым механизмом для задания универсальных синтаксических правил разбора, которыми руководствуется колорер. Сами по себе регулярные выражения довольно независимы и широко применяются; они позволяют описывать шаблоны для распознавания символьных данных - проще говоря регулярное выражение позволяет описать некий обобщенный класс строки символов определенного формата и ответить на вопрос принадлежит ли этому классу какая-то конкретная строка.

Каким образом задается этот шаблон? Для этого используются различные специальные символы, метасимволы и классы(наборы) символов. Само регулярное выражение является обычной строкой и любые символы в этой строке, которые не являются специальными(зарезервированными), считаются обычными символами. Служебные символы делятся на три класса: первый означает какой-либо класс(набор) символов (к примеру \w означает любую букву), второй в отличии от первого не имеет длины (например ^ - начало строки, \b - граница слова). Третий класс - это операторы. Операторы применяются к метасимволам, к обычным символам или к другим операторам. Любое выражение можно сгруппировать (заключить в скобки) и применить оператор ко всей группе.

Регулярные выражения колорера в стандартном синтаксисе совпадают с языком perl и различаются только по расширенным спецефическим операторам.

Синтаксис

Все регэкспы должны заключаться в слэши /.../ После конечного слэша могут идти параметры:

Далее в регэкспе последовательно сравнивается каждый символ с проверяемой строкой. Все, что не является указанными ниже спецсимволами или операторами, воспринимается, как обычный символ, рассматриваемый на совпадение.

Спецсимволы

    ^     Начало строки
    $     Конец строки
    .     Любой символ кроме переводов строки (без параметра //s)
    [ ]   Любой из перечисленного набора символов
    [^ ]  Ни один из набора
          В этих двух паттернах другие операторы не работают, но
          можно пользоваться другими метасимволами, и вариантом
          a-z , определяющим набор символов от первого до второго.
    \#    Следующий за слешем символ '#' (кроме a-z и 1-9) - квотирование
    \b    Начало слова
    \B    Конец слова
    \xNN  NN - ASCII символ (hex)
    \n    0x10 (lf)
    \r    0x13 (cr)
    \t    0x09 (tab)
    \s    Пробел (tab/space/cr/lf)
    \S    Не пробел
    \w    Символ слова (буквы, цифры, _)
    \W    Символ не-слова
    \d    Число
    \D    Не число
    \u    Символ в верхнем регистре
    \l    В нижнем

Расширенные спецсимволы

В отличии от обычных символов эти классы не совместимы с перловыми:

    \c    Означает 'не-слово-до...'
    \N    Ссылка внутри регэкспа на его же разобранную
          скобку, число N - номер нужной группы (скобки).
          Этот оператор работает с некоторыми ограничениями
          на тип ссылаемого блока - он работает, только если
          в ссылаемой скобке нет операторов повторения.
А эти операторы спецефичны для колорера и могут отключаться при компиляции класса cregexp:
#ifdef COLORERMODE
    ~     Ловит начало предыдущей схемы (конец блока start).
    \m    Смена начала регэкспа.
    \M    Смена конца регэкспа.
    \yN   Ссылка в тэге End на тэг Start. Число N - номер
          нужной подгруппы.
    \YN   Аналогично предыдущему - но совпадение должно быть
          с точностью до регистра символов.
#endif

Операторы

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

    ( )   Сгруппировать символы в один паттерн и запомнить
    |     Предыдущий или следующий паттерн
    *     Ноль или больше раз
    +     Один или больше раз
    ?     0 или 1 раз предыдущая маска
    {n}   Повторять n раз
    {n,}  Повторять n или больше раз
    {n,m} Повторять от n до m раз
Если после оператора добавить ?, то он превращается из жадного в нежадный. К примеру жадный * будет нежадным после замены его на *? Жадные операторы производят максимальный захват в строке, а нежадные захватывают по минимуму.

Расширенные операторы

    ?#N   Это оператор 'просмотра назад'. N - число символов для просмотра.
    ?~N   Отрицание просмотра назад.
    ?=    Просмотр вперед.
    ?!    Отрицание просмотра вперед.

Заметьте, что хотя последние два оператора существуют и в перле, в нем они записываются в виде (?=foobar). В случае же колорера оператор выглядит как (foobar)?=

Немного примеров

/foobar/
    совпадет с "foobar", "foobar barfoo"
/ FOO bar /ix
    совпадет с "foobar" "FOOBAR" "foobar and two other foos"
/(foo)?bar/
    совпадет с "foobar", "bar"
/^foobar$/
    совпадет _только_ с "foobar"
/f[obar]+r/
    совпадет с "foobar", "for", "far"
/([\d\.])+/
    задает любое число с десятичной запятой
/((foo)|(bar))+/
    совпадет с "foofoofoobarfoobar", "bar"