Описание синтаксиса регулярных выражений библиотеки Colorer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Оно. Вся работа колорера основывается на использовании регулярных выражений. Они позволяют создать универсальные синтаксические правила расцветки, хотя и сами достаточно независимы. Здесь вы найдете описание операторов и синтаксиса моих регулярных выражений, ограничений и подводных камней (чет слишком официально начал...) В дальнейшем описании, я буду предполагать, что хотя бы примерно знаете, чего это такое - регэкспы - и с чем его едят, хотя бы понаслышке. Сначала я опишу сам синтаксис моих RegExp-ов, а потом скажу, как их кушать. Вообще, синтаксис их почти совпадает с перловым. Собственно, вместо моих сплетен можете почитать man perlre - или чего там еще найдете. Вообще, у моих регэкспов есть одно главное отличие от перловых - у меня все операторы записываются после соответствующего паттерна. То есть перловый оператор просмотра вперед, записываемый там, как /foo(?=bar)/ у меня запишется так: /foo(bar)?=/ Может и не очень красиво, зато правильнее и логичнее. Все стандартные регэкспы совпадают с перловыми. Вы спросите, зачем эти расширенные операторы? Отвечу - покопаетесь в Hrc часок-другой-третий - поймете. 2. Ну, все-таки: Все регэкспы должны заключаться в слэши /.../ После конечного слэша могут идти параметры: i - Не различать регистр. x - Игнорировать явные пробелы(для удобства). Далее в регэкспе последовательно сравнивается каждый символ с проверяемой строкой. Все, что не является указанными ниже спецсимволами или операторами, воспринимается, как обычный символ, рассматриваемый на совпадение. 2.1. Спецсимволы: ^ Начало строки $ Конец строки . Любой символ [ ] Любой из набора символов [^ ] Ни один из набора В этих двух паттернах другие операторы не работают, но можно пользоваться другими спецсимволами, и вариантом a-z , определяющим набор символов от первого до второго. \# Следующий за слешем символ(кроме a-z и 1-9) \b Начало слова \B Конец слова \xNN NN - ASCII символ (hex) \n 0x10 (lf) \r 0x13 (cr) \t 0x09 (tab) \s Пробел (tab/space) \S Не пробел \w Символ слова (буквы, цифры, _) \W Символ не-слова \d Цифра \D Не цифра \u Символ в верхнем регистре \l В нижнем 2.2. Расширенные спецсимволы: \c Означает 'не-слово-до...'(схож с \b) \m Смена начала регэкспа \M Смена... нда... конца регэкспа \N Ссылка внутри регэкспа на его же разобранную скобку, число N - номер нужной группы (скобки). Этот оператор работает с некоторыми ограничениями на тип ссылаемого блока - он работает, только если в ссылаемой скобке нет операторов повторения. \yN Ссылка в тэге End на тэг Start. Число N - номер нужной подгруппы. 2.3. Операторы. А теперь пошли и они. Они не могу применяться просто так - без всего. Оператор действует на определенный перед ним символ(спец или обычный). Если множество символов заключено в скобки, после которых стоит оператор, он действует на всю скобку ( ) Сгруппировать символы в один паттерн и запомнить | Предыдущий или следующий паттерн * Ноль или больше раз + Один или больше раз ? 0 или 1 раз предыдущая маска {n} Повторять n раз {n,} Повторять n или больше раз {n,m} Повторять от n до m раз Если после оператора добавить ?, то он превращается из жадного в нежадный. К примеру жадный * будет нежадным после замены его на *? Жадные операторы производят максимальный захват в строке, а нежадные захватывают по минимуму. 2.4. Расширенные операторы. ?#N Это оператор 'просмотра назад'. N - число символов для просмотра. ?~N Отрицание просмотра назад. ?= Просмотр вперед. ?! Отрицание просмотра вперед. Страшно выглядит, не правда ли? 3. Ну, под конец, как водится, несколько примерчиков. /foobar/ совпадет с "foobar", "foobar barfoo" / FOO bar /ix совпадет с "foobar" "FOOBAR" "foobar and two other foos" /(foo)?bar/ совпадет с "foobar", "bar" /^foobar$/ совпадет _только_ с "foobar" /([\d\.])+/ Любое число с десятичной запятой /((foo)|(bar))+/ совпадет с "foofoofoobarfoobar", "bar"