Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "Regular Expressions (RegEx) - Quick Reference", по ссылке из статьи "RegExReplace()", в содержании - "Functions" - "RegExReplace", v1.0.46.07.

Ник переводчика: NikVasKo.

Настоящее имя переводчика: Николай Козлов, г. Москва.

Регулярные выражения (RegEx) - краткий справочник

Примечание переводчика: мы для краткости будем называть регулярное выражение шаблоном. Розовым в тексте отмечены шаблоны, зеленым - отвечающие им строки.

Основные положения

Шаблон не привязан к началу: по умолчанию, шаблон может отвечать подстроке в любом месте исследуемой строки. К примеру шаблон abc отвечает abc123, 123abc, и 123abcxyz. Чтобы обязать шаблон соответствовать строго началу или концу строки, используются якоря (см. ниже).

Экранированные (escaped) символы: большинство литер (например, abc123) внутри шаблона понимаются буквально. Но чтобы литеры, которые используются как метасимволы (\.*?+[{|()^$), понимались в обычном смысле, их надо предварять влево наклоненной чертой. Например, \. означает буквально точку, и \\ означает буквально левую наклонную.

Чувствительность к регистру: по умолчанию в шаблонах различаются заглавные и строчные буквы. Эту чувствительность можно игнорировать, используя флаг "i". Например: i)abc ответит и "abc", и "Abc",и "aBC", и "ABC". Существуют и другие флаги - подробности в разделе "Опции" статьи "RegExMatch()".

Выражения для шаблона

.

Точка соответствует любому отдельному символу (исключая символы новой строки: `r и `n). Например, ab. отвечает abc и abz и ab_

*

Звездочка соответствует повторенному любое число раз или отсутствующему предыдущему элементу. Элементом может быть символ, символ из перечня, или подшаблон. Например, a* отвечает ab и aaab, а если строка вовсе не содержит "a", то шаблон даст пустой ответ в начале строки (в позиции 1).

ВсеЧтоУгодно: шаблон точка-звездочка .* является одним из самых необязательных шаблонов, поскольку он отвечает любой последовательности (даже пустой) любых символов (кроме `r и `n). Например, abc.*123 отвечает и abcВсеЧтоУгодно123 и abc123.

?

Знак вопроса означает, что предыдущий элемент (символ, символ из перечня, или подшаблон) необязателен. Например, colou?r отвечает и color и colour, потому что "u" необязательно.

+

Знак плюс означает, что предыдущий элемент (символ, символ из перечня, или подшаблон) встречается один раз или повторяется несколько раз. Например, a+ находит ab или aaab. Но в отличие от a* и a?, шаблон a+ не даст совпадения вовсе, если в строке отсутствует "a".

{min,max}

Означает, что предыдущий элемент (символ, символ из перечня, или подшаблон) может быть повторен некоторое число раз. Это число повторений лежит в пределах от min до max. Например, a{1,2} отвечает первой букве из ab или только первым двум буквам из aaab. А вот {3} означает точно 3 повторения, {3,} означает 3 или больше повторений.

Примечание: min и max не должны превышать 65536, а min не должно превышать max.

[...]

Перечни символов: в квадратные скобки заключается список или интервал списка символов (или и то и другое). Например, [abc] значит "один любой символ из a, b, c". Знак минуса между символами означает интервал; например, [a-z] значит "один любой символ из интервала от строчной a до строчной z (включительно)".

После перечня можно поставить символы *, ?, +, или {min,max}. Например, [0-9]+ отвечает любому числу; то есть отвечает xyz123, но не отвечает abcxyz.

Списки и интервалы можно комбинировать; например, [a-zA-Z0-9_] означает "один символ, который может быть или латинской буквой или цифрой или подчеркиванием".

[^...]

Означает один любой символ из тех, которых нет в перечне. Например, [^/]* есть пустая или любой длины последовательность любых символов, среди которых нет символа "/", например: http://. Сходным образом, [^0-9xyz] есть любой символ, не являющийся цифрой или буквой x, y, или z.

\d

Отвечает отдельной цифре (эквивалент перечня [0-9]). Наоборот, заглавная \D значит "что угодно, но не цифра". Этот символ , как и символы "\s", "\w", можно включать внутрь перечня; например, [\d.-] значит "цифра, точка или минус".

\s

Отвечает любому из пробельных символов (одному), то есть space, tab, `r , `n. Наоборот, заглавная \S означает "любой из непробельных символов".

\w

Отвечает любому из "словесных" символов (одному). К ним относятся буквы, цифры, знак подчеркивания. Это эквивалент [a-zA-Z0-9_]. Наоборот, заглавная \W означает "любой 'несловесный' символ". (Примечание переводчика: AutoHotKey не считает русские буквы буквами.)

^
$

Крышечка (^) и доллар ($) называются якорями, потому что они не замещают ни одного из символов, но прикрепляют шаблон к началу или концу входной строки.

^ можно ставить в начало шаблона, требуя, чтобы соответствие было найдено только в начале строки. Например, ^abc ответит abc123, но не ответит 123abc.

$ можно ставить в конец шаблона, требуя, чтобы соответствие было найдено в конце строки. Например, abc$ ответит 123abc, но не ответит abc123.

Оба якоря можно комбинировать. Например, ^abc$ отвечает строке из трех букв abc (ни до, ни после, в строке не должно быть других символов).

Если разыскиваемый текст размещается на нескольких строках (использована опция "m", см. статью "RegExMatch()"), якоря можно использовать в любом месте и неоднократно, чтобы отметить начала и концы строк. Например, m)^456$ найдет 123`r`n456`r`n789. Но без опции "m" совпадения не будет.

\b

Символ границы слова (\b) тоже является якорем, потому что не отвечает никакой литере. Он просто означает, что если слева от него находится символ, относящийся к 'словесным' (\w), то справа должен быть не относящийся к таковым. Или ровно наоборот. Обычно он применяется, чтобы избежать нахождения слова, которое находится внутри другого. Например, \bDOG\b не отвечает HOTDOG, но отвечает DOG, независимо от того, какие знаки пунктуации и пробелов находятся вокруг. Заглавная \B ведет себя противоположно: она отмечает место, которое не является границей слова. (Примечание переводчика: граница слова не определяется для кириллицы. AutoHotKey не считает русские буквы буквами.)

 |

Вертикальная черта разделяет варианты, между которыми можно выбирать. Совпадение принимается, если любой из альтернативных элементов совпадает. Например, gray|grey отвечает и gray, и grey. Аналогично шаблон gr(a|e)y делает ту же работу благодаря скобкам. Примечание переводчика: требуется добавить, что первым вариантом считается все от "(" или начала шаблона до '|', а последним - все от '|' до ")" или конца шаблона. Обычно, чтобы не запутаться, набор вариантов всегда заключают в скобки, даже если без этого можно было бы обойтись.

(...)

В круглые скобки заключают группы элементов, чтобы:
  • Определить порядок оценивания. Например, стол(|а|у|ом|е) соответствует падежам слова стол.
  • Применять *, ?, +, и {min,max} к последовательности символов, а не к одному символу. Например, (пра)+ совпадает с повторяющейся приставкой "пра"; таким образом, находит "праправнук" и "прапрапрадед", но не находит "предок".
  • Выделить некоторый подшаблон, например точка-звездочка: abc(.*)xyz. Например, функция RegExMatch() в своем выходном массиве может сохранить соответствия всех выделенных подшаблонов, функция RegExReplace() разрешает, чтобы подстроки, соответствующие каждому из подшаблонов, были сохранены в результате путем использования обратных ссылок в духе $1. Чтобы использовать скобки, не вызывая сохранения группы, сразу после открывающей скобки поставьте ?:; например: (?:.*).
  • Модифицировать опции (см. статью "RegExMatch()") "на лету". Например, (?im) включает чувствительность к регистру и многострочную обработку до конца шаблона (или подшаблона, если модификаторы находятся внутри него). Напротив, (?-im) выключит обе опции. Поддерживаются все опции, кроме DPS`r`n.

\t
\r

etc.

Такие цепочки литер, начинающиеся с левой наклонной, также являются метасимволами. Самые употребительные из них: \t (tab), \r (carriage return) и \n (linefeed). В AutoHotkey для обозначения служебных знаков вместо левой наклонной можно использовать знак акцента (`). Поддерживаются также цепочки в форме \xhh, где hh есть 16-ричный код ANSI от 00 до FF. Начиная с версии 1.0.46.06, метасимвол \R замещает коды новой строки любого из употребляемых типов: `r, или `n, или `r`n.

Жадность: (Примеч. переводчика: жадный символ из нескольких возможных отвечающих вариантов выберет самый длинный.) по умолчанию, символы *, ?, +, {min,max} являются жадными, поскольку они поглощают все символы, включая последний из тех, что еще отвечают всему шаблону. Чтобы взамен этого, заставить их остановиться на самом коротком из возможных вариантов соответствия, добавьте следом за любым из них знак вопроса. Например, шаблон <.+> (в котором нет знака вопроса) означает: "найти <, за которым следует одна или большее число литер, за которыми следует >". Такой шаблон захватит всю строку <em>text</em>. Добавьте знак вопроса за плюсом: <.+?>. И поиск остановится на первом символе '>', таким образом этот шаблон отвечает только открывающему тегу <em>.

Запросы вперед и назад: выражения (?=...), (?!...), (?<=...), и (?<!...), в которых на месте многоточия размещается любой шаблон, назовем запросами (assertion). Они только запрашивают выполнение некоторого условия, но сами не отвечают каким-либо символам. Например, abc(?=.*xyz) является запросом вперед, проверяющим, существует ли где-либо строка xyz, лежащая правее строки abc (если не существует, то весь шаблон считается не соответствующим). Конструкцию (?=...) называют позитивным запросом вперед, поскольку он требует, чтобы указанный шаблон находил соответствие впереди. Наоборот, (?!...) есть негативный запрос вперед, поскольку он требует, чтобы указанный шаблон НЕ находил соответствие впереди. Подобным же образом, (?<=...) и (?<!...) представляют соответственно позитивный и негативный запросы назад, поскольку они требуют, чтобы указанный шаблон проверял соответствие слева от текущей позиции. Запросы назад более ограничены в возможностях, чем запросы вперед, поскольку не поддерживают кванторы переменного размера *, ?, и +.

Связанные темы: шаблоны поддерживаются функциями RegExMatch(), RegExReplace(), и командой SetTitleMatchMode.

Заключительное примечание: хотя на этой странице мы коснулись большинства особенностей регулярных выражений, есть еще несколько возможностей, которые вы может быть захотите использовать, например, "условные подшаблоны".

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.