Краткая справка о синтаксисе регулярных выражений

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

Классы символов

Классы символов полезны для краткого представления различных групп символов.

Примеры:

Обозначение

Класс

[а-я]

Строчные буквы. Не включает символы с ударением и лигатурами.

[а-я0-9]

Строчные буквы от а до я а также цифры от 0 до 9.

[А-Яа-я-]

Заглавные, строчные буквы, а также тире. Чтобы включить тире в классе, вы должны поместить его в начале или в конце, чтобы не путать его с дефисом, который обозначает диапазон символов.

[^0-9]

Любые символы, кроме цифр. Каретка (^), помещенная в начале класса, исключает символы класса (дополненный класс).

[[a-z]--[aeiouy]] [[а-я]--[аеёиоуыэюя]]

Строчные согласные. Класс может быть включен в класс. Символы -- исключают то, что следует за ними

[\w--[\d_]]

Все буквы (включая иностранные акцентированные символы). Сокращенные классы могут использоваться внутри класса

Пример:

<[^<>]+> to select an HTML tag

Сокращенные классы символов

Обозначение

Класс

\d

Цифра (то же, что и [0-9])

\D

Любой нецифовой символ (то же, что и [^0-9])

\w

Буквенно-цифровой символ ([a-zA-Z0-9]), включая символы с меткой ударения и лигатуры

\W

Любой “non-word” («несловесный») символ

\s

Space (пробел), non-breaking space (неразрывный пробел), tab (табуляция), return line (обратная строка)

\S

Любой символ «без пробелов»

.

Любой символ кроме новой строки. Используйте флажок «dot all» или модификатор regexp (?s), чтобы включить символ новой строки.

Квантификаторы

Квантификатор

Количество вхождений выражения, предшествующего квантификатору

?

0 или 1 повторение регулярного выражения. Эквивалентно {0,1}.

+

Одно или более повторение регулярного выражения. Эквивалентно {1,}.

*

Любое - 0, 1 или более - количество повторений регулярного выражения. Эквивалентно {0,}.

{n}

Ровно n повторений регулярного выражения.

{min,max}

Количество повторений регулярного выражения, не менее min раз и не более max раз.

{min,}

Не менее min повторений регулярного выражения.

{,max}

Количество вхождений между 0 и включенным максимальным значением

Жадность

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

Остерегайтесь вложенных квантификаторов, например, шаблона (a*)*, поскольку он экспоненциально увеличивает время обработки.

Перечисление

Символ | в регулярном выражении соответствует логическому ИЛИ (OR). Т. е. могут совпадать либо предыдущее, либо последующее выражения.

Исключение

Метод 1

шаблон_исключения(*SKIP)(*FAIL)|шаблон_для_поиска

Пример:

"Blabla"(*SKIP)(*FAIL)|Blabla

выбирает Blabla, в строках Blabla или «Blabla или Blabla», но не в «Blabla».

Метод 2

шаблон_для_исключения\K|(шаблон_для_отбора)

"Blabla"\K|(Blabla)

выбирает Blabla, в строках Blabla или «Blabla или Blabla», но не в «Blabla».

Якоря

Якорь - это способ сопоставления логического расположения в строке, а не символа. Наиболее полезными якорями для обработки текста являются:

\b

Обозначает границу слова, то есть переход от пробела к непропробельному символу. Например, вы можете использовать \bsurd для сопоставления с surd, но не absurd.

^

Соответствует началу строки (в многострочном режиме, который используется по умолчанию)

$

Соответствует концу строки (в многострочном режиме, который используется по умолчанию)

\K

Сбрасывает начальную позицию выделения в его позицию в шаблоне. Некоторые движки регулярных выражений (но не calibre) не позволяют просматривать данные переменной длины, особенно с квантификаторами. Когда вы можете использовать \K с этими движками, это также позволяет вам избавиться от этого предела, написав эквивалент положительного взгляда позади длины переменной.

Группы

(выражение)

Группа захвата, которая хранит выбор и может быть вызвана позже в шаблонах search или replace на \n, где `` n`` - порядковый номер группы захвата (начиная с 1 в порядке чтения)

(?:выражение)

Группа, которая не захватывает выбор

(?>expression)

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

(?|expression)

Группа сброса ветвей: ветви чередований, включенные в выражение, имеют одинаковые номера групп

(?<name>expression)

Группа под названием «имя». Выбор может быть вызван позже в шаблоне search с помощью (?P=name) и в replace на \g<name>. Две разные группы могут использовать одно и то же имя.

Взгляды по сторонам

Взгляд по сторонам

Смысл

?=

Позитивный lookahead (взгляд вперёд) (будет размещен после выделения)

?!

Негативный lookahead (взгляд вперёд) (ставится после выделения)

?<=

Позитивный lookbehind (взгляд назад) (ставится перед выделением)

?<!

Негативный lookbehind (взгляд назад) (ставится перед выделением)

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

При поиске нескольких совпадений в строке, в начальной позиции каждой попытки сопоставления, взгляд назад может проверять символы перед текущей позицией. Поэтому в строке 123 шаблон (?<=\D)\d (цифра, перед которой стоит цифра) должен теоретически выбрать 2 и 3. С другой стороны, \d\K\d может выбрать только 2, потому что начальная позиция после первого выбора находится непосредственно перед 3, и для второго совпадения недостаточно цифр. Точно так же \d(\d) только захватывает 2. В практике движка регулярных выражений calibre положительный взгляд назад (positive lookbehind) ведёт себя таким же образом и выбирает только 2, вопреки теории.

Группы могут быть помещены в lookarounds (взгляды по сторонам), но захват редко полезен. Тем не менее, если это будет полезно, необходимо будет быть очень осторожным при использовании квантификатора во взгляде назад: жадность, связанная с отсутствием обратного отслеживания, может дать неожиданный захват. По этой причине, используйте \K, а не положительный взгляд назад (positive lookbehind), когда у вас есть квантификатор (или, что еще хуже, несколько) в группе захвата положительного взгляда назад (positive lookbehind).

Пример негативного взгляда вперёд:

(?![^<>{}]*[>}])

Помещенный в конец шаблона препятствует выделению внутри тега или стиля, встроенного в файл.

Когда бы ни было возможно, всегда лучше «закрепить» обходные пути, чтобы уменьшить количество шагов, необходимых для получения результата.

Рекурсия

Обозначение

Смысл

(?R)

Рекурсия всего шаблона

(?1)

Рекурсия единственного шаблона нумерованной группы захвата, здесь группа 1

Рекурсия вызывает себя. Это полезно для сбалансированных запросов, таких как строки в кавычках, которые могут содержать встроенные строки в кавычках. Таким образом, если во время обработки строки между двойными кавычками мы сталкиваемся с началом новой строки между двойными кавычками, мы хорошо знаем, как это сделать, и мы вызываем себя. Тогда у нас есть шаблон, вроде:

start-pattern(?>atomic sub-pattern|(?R))*end-pattern

Чтобы выбрать строку между двойными кавычками, не останавливаясь на встроенной строке:

“((?>[^“”]+|(?R))*[^“”]+)”

Этот шаблон также можно использовать для изменения пар тегов, которые могут быть встроены, таких как теги <div>.

Специальные символы

Обозначение

Символ

\t

табуляция

\n

Разрыв строки

\x20

(разрываемый) пробел

\xa0

неразрываемый пробел

Мета-символы

Мета-символы - это те, которые имеют особое значение для движка регулярных выражений. Из них двенадцати должен предшествовать escape-символ, обратная косая черта (\), чтобы потерять свое особое значение и снова стать обычным символом:

^ . [ ] $ ( ) * + ? | \

Семи другим метасимволам не обязательно должен предшествовать обратный слеш (но он может быть без каких-либо других последствий):

{ } ! < > = :

Специальные символы теряют свой статус, если они используются внутри класса (между скобками []). Закрывающая скобка и тире имеют особый статус в классе. Вне класса тире - это простой литерал, закрывающая скобка остается метасимволом.

Косая черта (/) и знак числа (или хэш-символ) (#) не являются метасимволами, их не нужно экранировать.

В некоторых инструментах, таких как regex101.com с движком Python, двойные кавычки имеют специальный статус разделителя и должны быть экранированы, либо параметры изменены. Это не так в редакторе calibre.

Режимы

(?s)

Заставляет точку (.) совпадать с символами новой строки

(?m)

Заставляет якоря ^ и $ соответствовать началу и концу строк вместо начала и конца всей строки.