Поиск и замена – ЧАСТЬ 2

12.2  Ненаращиваемый поиск

В Emacs также есть удобные команды ненаращиваемого поиска, которые требуют от вас полностью набрать строку поиска до начала работы.

C-s hRETстрока hRETi

Поиск заданной строки.

C-r hRETстрока hRETi

Поиск строки в обратном направлении.

Чтобы начать ненаращиваемый поиск, наберите сначала C-s hRETi. Эта команда входит в минибуфер для считывания строки поиска; ограничьте  эту строку с помощью hRETi,  и поиск начнется. Если строка не будет найдена, команда поиска выдает ошибку.

Способ работы C-s hRETi  заключается в следующем:  C-s запускает наращиваемый поиск, который специально запрограммирован  так,  что запускает ненаращиваемый поиск, если заданный вами аргумент является пустым. (Такой пустой аргумент в других случаях был бы бесполезен). C-r hRETработает аналогично.

Однако, запрошенный с помощью C-s hRETi  ненаращиваемый поиск не запускает непосредственно search-forward. Первым делом проверяется,  не будет ли следующим знаком C-w, что запустит поиск слов.

Прямой  и  обратный  ненаращиваемый поиск  осуществляются командами searchforward  и search-backward.   Эти команды могут  быть привязаны к  ключам обычным способом.   Возможность их  запуска через наращиваемый поиск  имеет исторические причины и, помимо этого, существует для того, чтобы вам не нужно было находить для них подходящие последовательности ключей.

12.3  Поиск слов

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

Поиск слов полезен при редактировании печатных документов, подготовленных в программах для форматирования текста.  Если вы редактируете, просматривая уже напечатанную, отформатированную  версию, то вы не можете сказать, где прерывается строка в исходом файле. При помощи же поиска слова вы можете искать, не имея этой информации.

C-s hRETC-w слова hRETi

Ищет слова, игнорируя пунктуацию между ними.

C-r hRETC-w слова hRETi

Ищет слова в обратном направлении, игнорируя пунктуацию между ними.

Поиск слов — это специальный случай ненаращиваемого  поиска, и он вызывается  с помощью C-s hRETC-w. За этим следует строка поиска, которая всегда должна быть ограничена hRETi.  Будучи ненаращиваемым, поиск не начинается  до тех  пор, пока аргумент не завершен. Этот поиск работает путем создания регулярного выражения и его поиска; смотрите Раздел 12.4 [Поиск регулярного выражения], с. 90.

Для обратного поиска слов используйте C-r hRETC-w.

Прямой и обратный поиск слов реализован в командах word-search-forward и wordsearch-backward.  Эти команды могут быть привязаны к ключам обычным способом. Возможность их запуска через наращиваемый  поиск существует по историческим причинам и для того, чтобы вам не нужно было находить для них подходящие последовательности ключей.

12.4  Поиск регулярного выражения

Регулярное выражение (regexp, если кратко) — это образец, который обозначает набор строк, возможно, и неограниченный набор. В GNU Emacs вы можете искать следующее совпадение с регулярным выражением как наращиваемым способом, так и простым.

Наращиваемый поиск регулярного выражения производится  набором C-M-s (isearchforward-regexp). Эта команда считывает наращиваемую строку поиска, так же, как C-s, но трактует  ее как регулярное выражение, а не ищет в тексте буфера точное совпадение. Каждый раз, когда вы добавляете текст в строку поиска, вы делаете регулярное выражение длиннее, и ищется уже новое регулярное выражение. Вызов C-s с префиксным аргументом (значение не  играет роли) — это другой способ произвести прямой поиск регулярного выражения.  Чтобы запустить поиск регулярного выражения в обратном направлении, используйте C-M-r (isearch-backward-regexp) или C-r с префиксным аргументом.

Все управляющие знаки, которые делают специальные вещи в рамках обыкновенного наращиваемого поиска, имеют те  же  самые функции и в наращиваемом поиске регулярного выражения.  Набор C-s или C-r  немедленно  после  начала поиска восстанавливает последнее регулярное  выражение,  использованное для наращиваемого поиска регулярного

выражения; это говорит о том, что наращиваемый поиск регулярного выражения и строки имеют независимые значения по умолчанию. Они также имеют раздельные списки поиска, доступ к которым вы можете получить с помощью M-p и M-n.

Если при наращиваемом поиске регулярного выражения вы наберете hSPCi, он будет совпадать с произвольной последовательностью пробельных знаков, включая переводы строк. Если вам нужен только один пробел, введите C-q hSPCi.

Обратите внимание,  добавление знаков к регулярному выражению при наращиваемом поиске может вернуть курсор назад и начать поиск снова. Например, если вы искали ‘foo’ и добавляете  ‘\|bar’, курсор вернется назад, если первый ‘bar’  предшествовал  первому

‘foo’.

Ненаращиваемый  поиск    регулярного    выражения   осуществляется   функциями re-search-forward и re-search-backward. Вы можете запустить их с помощью M-x, или привязать их к ключам или вызывать через наращиваемый поиск регулярного выражения с помощью C-M-s hRETи C-M-r hRETi.

Если вы используете команды наращиваемого поиска регулярного выражения с префиксным  аргументом, они производят обычный поиск строки,  как  isearch-forward и isearch-backward. См. Раздел 12.1 [Наращиваемый  поиск], с. 87.

12.5  Синтаксис регулярных выражений

Регулярные выражения имеют синтаксис, в котором несколько знаков служат специальными конструкциями, а остальные — это обыкновенные знаки. Обыкновенный знак — это простое регулярное выражение, которое соответствует этому знаку и никакому больше.  Специальными знаками являются ‘$’, ‘^’,  ‘.’, ‘*’, ‘+’, ‘?’, ‘[’, ‘]’ и ‘\’.  Любые другие знаки, появляющиеся в регулярном выражении, являются обыкновенными, если только им не предшествует  ‘\’.

Например, ‘f’  — это неспециальный  знак, значит он обыкновенный, поэтому ‘f’  — это регулярное выражение, которое соответствует строке ‘f’ и никакой другой.  (Оно не соответствует строке ‘ff’). Аналогично, ‘о’ — это регулярное выражение, которое соответствует только ‘о’. (Когда различия в регистре игнорируются, эти регулярные выражения также  совпадают с ‘F’ и ‘O’,  но мы рассматриваем это как  обобщение  понятия “та  же строка”, а не как исключение.)

Любые два регулярных выражения a и b могут быть сцеплены.  Результатом является регулярное выражение, совпадающее со строкой, в которой a соответствует некоторому началу этой строки, а b соответствует остатку строки.

В качестве простого примера мы можем сцепить регулярные выражения ‘f’ и ‘o’, чтобы получить регулярное выражение ‘fo’,   которое соответствует только строке  ‘fo’.    Пока все просто. Чтобы сделать что-то нетривиальное, вам необходимо использовать  один из специальных знаков. Здесь представлен их перечень.

. (Точка)   является специальным знаком, который соответствует любому одиночному знаку, за исключением перевода строки. Используя конкатенацию (сцепление), вы можете составить регулярное выражение, подобное ‘a.b’, которое соответствует любой трехзнаковой строке, начинающейся с ‘a’ и кончающейся на ‘b’.

*            сама по себе  не  является конструкцией;  это постфиксный  оператор, который означает, что предыдущее регулярное выражение должно быть повторено столько раз, сколько это возможно. Таким образом, ‘o*’ соответствует любому числу букв ‘o’ (включая нуль).

‘*’ всегда относится к  наименьшему  возможному предыдущему выражению.

Таким образом, ‘fo*’ содержит повторяющуюся ‘о’, а не ‘fo’.  Оно совпадает с

‘f’, ‘fo’,  ‘foo’  и так далее.

Конструкция  ‘*’ обрабатывается  путем сопоставления с наибольшим количеством повторений, которое сразу может быть найдено. Затем продолжается сравнение с остатком шаблона. Если оно прошло неудачно, то происходит перебор с возвратом. Некоторые из совпадений с конструкцией с модификатором

‘*’ сбрасываются, чтобы дать возможность поиска соответствия для остатка структуры.  Например, сравнивая ‘ca*ar’ со строкой ‘caaar’,  ‘a*’  сначала ставится в соответствие со всеми тремя ‘а’, но остаток шаблона — это ‘ar’,  а в этом случае для подбора остается только ‘r’, поэтому эта попытка неудачна. Следующий вариант — это поставить в соответствие с ‘а*’ только две буквы

‘а’. При таком выборе остаток регулярного выражения успешно соответствует строке.

+                это такой же  постфиксный оператор, как и ‘*’, за исключением  того, что он требует, чтобы предшествующее ему выражение сопоставлялось  по крайней мере один раз.  Так  например, ‘ca+r’  будет соответствовать  строкам ‘car’  и

‘caaar’, но не строке ‘cr’,  тогда как ‘ca*r’ соответствует  всем трем строкам.

?                постфиксный оператор, как  и ‘*’, но он может соответствовать  предшествующему выражению либо один раз, либо ни одного.  Например,  ‘ca?r’  будет соответствовать ‘car’  или ‘cr’  и ничему больше.

[ … ]   это набор знаков, который начинается ‘[’  и завершается ‘]’.   В  простейшем случае совпадающий набор формируют  знаки между этими скобками.

Таким образом, ‘[ad]’ соответствует либо одной ‘a’, либо одному ‘d’, а ‘[ad]*’ соответствует любой строке, составленной просто из ‘а’ и ‘d’ (включая пустую строку), из всего этого следует, что ‘c[ad]*r’ соответствует ‘cr’,  ‘car’,  ‘cdr’,

‘caddaar’ и так далее.

Вы также можете включить в множество знаков интервалы, написав два знака, разделенные ‘-’; таким образом, ‘[a-z]’ соответствует любой строчной букве ASCII. Интервалы могут быть свободно перемешаны  с отдельными знаками, как в ‘[a-z$%.]’, что соответствует  любой строчной букве ASCII, или ‘$’, или

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий