Регулярные выражения для поиска и замены

Far Manager


Регулярные выражения для поиска

Синтаксис регулярных выражений почти полностью совпадает с перловыми регэкспами.

Общий вид: regexp или /regexp/options.

Опции (options):
i - игнорировать регистр.
s - рассматривать текст как одну строку, '.' совпадает с абсолютно любым знаком.
m - рассматривать текст как много строк. ^ и $ совпадают с началом и концом любой "внутренней" строки.
x - просто пробельные знаки (без обратного слеша впереди) игнорируются - полезно в сложных выражениях для структуризации.

regexp - последовательность знаков и метасимволов. К знакам относятся буквы и цифры, всё остальное, если и не является метасимволом, может им стать, поэтому всё, что не есть буква и не есть цифра, следует делать знаком "насильственно". Для этого надо перед ним поставить обратный слеш - \.

Обратите внимание на то, что все слеши (и прямые, и обратные) в вашем регулярном выражении должны писаться со спецсимволом \ впереди, чтобы не быть спутанными с другими спецсимволами или концом выражения. Пример: строка "большое\белое/страшное" в виде регулярного выражения должна выглядеть так - "большое\белое\/страшное".

Метасимволы

\Следующий за ним знак будет рассмотрен именно как знак, а не как метасимвол.
^Начало строки.
$Конец строки.
|Альтернатива. Должно совпасть выражение до или после |.

Пример: "\d+\w+|Hello\d+" работает как "(\d+\w+)|(Hello\d+)", а не как "\d+(\w+|H)ello\d+".
() Группировка - группировка служит либо для использования "ссылок", либо для использования попавшего в скобку фрагмента текста при замене.

Кроме группировки круглые скобки служат ещё для следующих операций:

(?:pattern) - обычная группировка, но только эта скобка не получает "номера".

(?=pattern) - просмотр вперёд. Совпадение продолжится с того же места, но только если pattern в этой скобке совпал. Например, \w+(?=\s) совпадёт со словом, за которым идёт пробел, причём пробел не будет включён в результат поиска.

(?!pattern) - отрицание просмотра вперёд. Совпадение продолжится с того же места, если pattern НЕ совпадёт. Например, foo(?!bar) совпадёт с любым вхождением "foo", которое встречается без последующего "bar". Помните, что это выражение имеет нулевой размер, что означает, что a(?!b)d совпадёт с ad, потому что a сопровождается знаком, который не b (а d), а d идёт за выражением нулевого размера.

(?<=pattern) - просмотр назад. К сожалению, pattern должен быть фиксированной длины.

(?<!pattern) - отрицание просмотра назад. Те же ограничения, что и для просмотра назад.
[]Класс знаков - это метасимвол который совпадёт с любым из перечисленных в [] знаком или диапазоном знаков. Диапазоны указываются например так: [a-z] Метасимволы не учитываются в классах символов. Если первый знак класса - ^, то это делается негативный класс. Если хочется добавить в класс знак ^, он либо не должен быть первым, либо перед ним должен быть \.

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

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

?- жадное совпадение 0 или один раз.
??- нежадное совпадение 0 или один раз.
*- жадное совпадение 0 или более раз.
*?- нежадное совпадение 0 или более раз.
+- жадное совпадение 1 или более раз.
+?- нежадное совпадение 1 или более раз.
{n}- совпадение точно n раз.
{n,}- жадное совпадение n или более раз.
{n,}?- нежадное совпадение n или более раз.
{n,m}- жадное совпадение не меньше чем n, но не больше чем m раз.
{n,m}?- нежадное совпадение не меньше чем n, но не больше чем m раз.
{,m}- эквивалентно {0,m}.
{,m}?- эквивалентно {0,m}?.

Что такое "жадный" и "нежадный" квантификатор?

Жадный квантификатор захватывает как можно больше. И только, если дальнейшего совпадения не получилось, "отдаёт" захваченное (происходит "откат", не самая "дешёвая" операция).

Если выражение "A.*Z" сопоставить строке "AZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", то ".*" сначала захватит всю строку, а потом будет по одному знаку "откатываться" пока не найдёт Z. А если выражение будет "A.*?Z" то Z найдётся сразу же. Нежадный квантификатор ещё называют минимизирующим, он захватывает минимально возможное количество знаков, и только, если дальнейшее совпадение не получилось, захватывает ещё.

Спецсимволы

Перед небуквой и нецифрой можно в большинстве случаев ставить знак \, а для букв и цифр это делать нужно осторожно, ибо таким образом обозначаются спецсимволы:

.- любой знак, кроме перевода строки. Если среди опций есть s, то вообще любой знак.
\t- tab (0x09)
\n- new line (lf, 0x0a)
\r- return (cr, 0x0d)
\f- form feed (0x0c)
\a- bell (0x07)
\e- escape (0x1b)
\xNNNN- hex char, где N - [0-9A-Fa-f].
\Q- начало квотирования метасимволов - всё, что квотируется, будет обрабатываться как текст, а не как регулярное выражение.
\E- конец квотирования метасимволов.
\w- буква, цифра или '_'.
\W- не \w.
\s- знак пробела (tab/space/lf/cr).
\S- не \s.
\d- цифра.
\D- не цифра.
\i- буква.
\I- не буква
\l- знак в нижнем регистре
\L- не знак в нижнем регистре
\u- знак в верхнем регистре
\U- не знак в верхнем регистре
\b- граница слова - означает, что слева или справа от текущей позиции находится знак из "слова", а справа или слева, соответственно, из "не слова"
\B- не \b
\A- начало текста, независимо от опции m
\Z- конец текста, независимо от опции m
\O- точка "невозврата". Если при матчинге пройден этот знак, то отката назад не будет, сразу выдаст no match. Можно использовать в сложном выражении после обязательного фрагмента с квантификатором. Этот спецсимвол можно использовать, когда обрабатываемые объёмы данных очень большие.

Пример: /.*?name\O=(['"])(.*?)\1\O.*?value\O=(['"])(.*?)\3/

Строки, в которых есть "name=", но нет "value=", будут обрабатываться (фактически - пропускаться) быстрее.
\NN- ссылка на ранее совпавшую скобку. NN - целое число от 0 до 15. Каждая скобка кроме (?:pattern), (?=pattern), (?!pattern), (?<=pattern) и (?<!pattern) имеет номер (по порядку появления открывающей скобки).

Пример: "(['"])hello\1" совпадёт с "hello" или 'hello'.
Примеры

/foobar/ совпадёт с "foobar", но не с "FOOBAR".

/ FOO bar /ix совпадёт с "foobar" и с "FOOBAR".

/(foo)?bar/ совпадёт с "foobar" и "bar".

/^foobar$/ совпадёт _только_ с "foobar", но не с "foofoofoobarfoobar".

/[\d\.]+/ совпадёт с любым числом с десятичной точкой.

/(foo|bar)+/ совпадёт с "foofoofoobarfoobar" и "bar".

/\Q.)))$\E/ эквивалентно "\.\)\)\)\$".

Регулярные выражения для замены

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

$0..$9, $A..$Z

Номера найденных групп. Соответствующая группа подставляется в строку во время работы. Номера группам присваиваются в порядке следования открывающих скобок в регулярном выражении.

$0 означает всю найденную последовательность целиком. $* заменяется на символ *.


Far Manager © 1996—2000 Eugene Roshal, © 2000—2015 Far Group