Синтаксис регулярных выражений
Следующее описание регулярных выражений частично основано на документации библиотеки REGEXP, созданной Henry Spencer. Sally использует эту библиотеку для поиска по регулярным выражениям.
Основной синтаксис регулярных выражений
- '^' — в начале выражения соответствует началу строки (например, '^test' находит все вхождения 'test' в начале строки)
- '$' — в конце выражения соответствует концу строки
- '.' — соответствует любому одному символу (например, 'do.' соответствует 'dog', 'dot', 'doe' и т. п.; 'd..r' соответствует 'door', 'deer' и т. п.)
- '*' — после выражения соответствует нулю или более повторениям этого выражения (например, 'ad*' соответствует 'a', 'ad' и 'add', то есть 'a', за которой следует любое число 'd')
- '+' — после выражения соответствует одному или более его повторениям (например, 'do+' соответствует 'do' и 'doo', то есть 'd', за которой следует хотя бы одна 'o')
- '?' — после выражения соответствует нулю или одному его вхождению (например, 'add?' соответствует 'ad' и 'add', то есть 'ad' с необязательной 'd' в конце)
- '|' — между выражениями соответствует первому выражению, второму и т. д. (например, 'red|blue|black' соответствует 'red', 'blue' и 'black', то есть любому из перечисленных слов)
- '[ ]' — символы в скобках соответствуют любому одному из указанных символов, но никаким другим (например, 'a[dts]' соответствует 'ad', 'at' и 'as', то есть 'a', за которой следует 'd', 't' или 's')
- '[^ ]' — символы в скобках соответствуют любому одному символу, не указанному в скобках (например, '[^abc]' соответствует любому символу, кроме 'a', 'b' и 'c')
- '[-]' — обозначает диапазон символов (например, '1[0-9]' соответствует всем числам от '10' до '19')
- '( )' — объединяет выражения в скобках в одно выражение (например, '(very )*well' соответствует 'well', 'very well' и 'very very well', то есть любому числу повторений 'very ', за которыми следует 'well')
- '\' — перед любым символом соответствует этому символу (например, 'too\.' соответствует только 'too.'; обратите внимание, что 'too.' соответствует 'tool', 'took', а также 'toon', то есть 'too', за которым следует любой символ)
Синтаксис регулярных выражений
Регулярное выражение состоит из нуля или более альтернатив, разделенных '|'. Оно соответствует всему, что соответствует одной из альтернатив.
Альтернатива состоит из нуля или более последовательно соединенных частей. Она соответствует первой части, за которой следует вторая и так далее.
Часть — это атом, за которым может следовать '*', '+' или '?'. Атом с '*' соответствует последовательности из нуля или более совпадений с этим атомом. Атом с '+' соответствует последовательности из одного или более совпадений. Атом с '?' соответствует одному совпадению с атомом или пустой строке.
Атом — это регулярное выражение в круглых скобках (соответствует всему, чему соответствует это выражение), диапазон (см. ниже), '.' (любой один символ), '^' (пустая строка в начале строки), '$' (пустая строка в конце строки), '\' с последующим одиночным символом (соответствует этому символу) или одиночный символ без специального значения (соответствует самому себе).
Диапазон — это последовательность символов в '[]'. Обычно он соответствует любому одному символу из этой последовательности. Если последовательность начинается с '^', диапазон соответствует любому одному символу, отсутствующему в остальной последовательности. Два символа, разделенные '-', обозначают полный список символов ASCII между ними (например, '[0-9]' соответствует любой десятичной цифре). Чтобы включить сам символ ']', поставьте его первым (после возможного '^'). Чтобы включить сам символ '-', поставьте его первым или последним.
Неоднозначность
Если регулярное выражение может соответствовать двум разным частям текста, выбирается та, которая начинается раньше. Если обе начинаются в одном месте, но имеют разную длину либо одинаковую длину при разных способах сопоставления, действуют следующие более сложные правила.
В общем случае альтернативы рассматриваются слева направо; варианты для '*', '+' и '?' — начиная с самых длинных; вложенные конструкции — снаружи внутрь; последовательно соединенные конструкции — начиная с самой левой. Выбирается совпадение, использующее первый подходящий вариант.
Например, '(ab|a)b*c' может соответствовать 'abc' двумя способами. Сначала выбирается между 'ab' и 'a'; поскольку 'ab' стоит раньше и позволяет получить полное совпадение, выбирается оно. Буква 'b' уже использована, поэтому 'b*' должна соответствовать последнему варианту — пустой строке, соблюдая предыдущий выбор.
В частном случае, когда отсутствует '|' и есть только один '*', '+' или '?', выбирается самое длинное возможное совпадение. Так, 'ab*' в строке 'xabbbby' соответствует 'abbbb'. Если же искать 'ab*' в 'xabyabbbz', получится 'ab' сразу после 'x' из-за правила наиболее раннего начала.
From the Sally manual (GPL-2.0-or-later), © 1997-2023 Open Salamander Authors; © 2025-2026 Elias Bachaalany. Source: manual source (zip) · original page in the Sally repository