Пошук і заміна – ЧАСТИНА 2

122  Ненаращіваемий пошук

У Emacs також є зручні команди ненаращіваемого пошуку, які вимагають від вас повністю набрати рядок пошуку до початку роботи

C-s hRETрядок hRETi

Пошук заданого рядка

C-r hRETрядок hRETi

Пошук рядка в зворотному напрямку

Щоб почати ненаращіваемий пошук, наберіть спочатку Cs hRETi Ця команда входить в мінібуфер для зчитування рядка пошуку обмежте цю рядок за допомогою hRETi, І пошук почнеться Якщо рядок не буде знайдена, команда пошуку видає помилку

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

Однак, запитаний за допомогою Cs hRETi  ненаращіваемий запитом не запускає безпосередньо search-forward Насамперед перевіряється, чи не буде наступним знаком Cw, що запустить пошук слів

Прямий і зворотний ненаращіваемий пошук здійснюються командами searchforward і search-backward Ці команди можуть бути привязані до ключів звичайним способом Можливість їх запуску через нарощуваний пошук має історичні причини і, крім цього, існує для того, щоб вам не потрібно було знаходити для них підходящі послідовності ключів

123  Пошук слів

Пошук за словами застосовується для відшукання послідовності слів незалежно від того, як ці слова розділені Більш докладно, ви набираєте рядок з декількох слів, використовуючи для їх поділу поодинокі прогалини, і цей рядок може бути знайдена, навіть якщо в оригіналі слова розділені декількома пропусками, перекладами рядка, або будь-якими знаками пунктуації

Пошук слів корисний при редагуванні друкованих документів, підготовлених у програмах для форматування тексту Якщо ви редагуєте, переглядаючи вже надруковану, отформатированную версію, то ви не можете сказати, де переривається рядок в результатом файлі За допомогою ж пошуку слова ви можете шукати, не маючи цієї інформації

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

Шукає слова, ігноруючи пунктуацію між ними

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

Шукає слова в зворотному напрямку, ігноруючи пунктуацію між ними

Пошук слів – це спеціальний випадок ненаращіваемого пошуку, і він викликається за допомогою Cs hRETC-w За цим слідує рядок пошуку, яка завжди повинна бути обмежена hRETi Будучи ненаращіваемим, пошук починається до тих пір, поки аргумент не завершений Цей пошук працює шляхом створення регулярного виразу і його пошуку дивіться Розділ 124 [Пошук регулярного виразу], с 90

Для зворотного пошуку слів використовуйте Cr hRETC-w

Прямий і зворотний пошук слів реалізований в командах word-search-forward і wordsearch-backward Ці команди можуть бути привязані до ключів звичайним способом Можливість їх запуску через нарощуваний пошук існує з історичних причин і для того, щоб вам не потрібно було знаходити для них підходящі послідовності ключів

124  Пошук регулярного виразу

Регулярний вираз (regexp, Якщо коротко) – це зразок, який позначає набір рядків, можливо, і необмежений набір У GNU Emacs ви можете шукати наступне збіг з регулярним виразом як нарощуються способом, так і простим

Нарощуваний пошук регулярного виразу проводиться набором CMs (isearchforward-regexp) Ця команда зчитує нарощувану рядок пошуку, так само, як Cs, але трактує її як регулярний вираз, а не шукає в тексті буфера точний збіг Кожен раз, коли ви додаєте текст в рядок пошуку, ви робите регулярний вираз довше, і шукається вже нове регулярне вираз Виклик C-s з префіксним аргументом (значення не грає ролі) – це інший спосіб провести прямий пошук регулярного виразу Щоб запустити пошук регулярного виразу у зворотному напрямку, використовуйте CMr (isearch-backward-regexp) або Cr з префіксним аргументом

Всі керуючі знаки, які роблять спеціальні речі в рамках звичайного наращиваемого пошуку, мають ті ж самі функції і в нарощуються пошуку регулярного виразу Набір Cs або Cr негайно після початку пошуку відновлює останнє регулярний вираз, використане для наращиваемого пошуку регулярного

вираження це говорить про те, що нарощуваний пошук регулярного вираження і рядки мають незалежні значення за замовчуванням Вони також мають роздільні списки пошуку, доступ до яких ви можете отримати за допомогою M-p і M-n

Якщо при нарощуються пошуку регулярного виразу ви наберете hSPCi, Він буде збігатися з довільною послідовністю пробільних знаків, включаючи перекази рядків Якщо вам потрібен тільки один пробіл, введіть Cq hSPCi

Зверніть увагу, додавання знаків до регулярному виразу при нарощуються пошуку може повернути курсор назад і почати пошук знову Наприклад, якщо ви шукали foo і додаєте \ | bar, курсор повернеться назад, якщо перший bar передував першому

‘foo’

Ненаращіваемий пошук регулярного виразу здійснюється функціями re-search-forward і re-search-backward Ви можете запустити їх за допомогою Mx, або привязати їх до ключів або викликати через нарощуваний пошук регулярного виразу за допомогою CMs hRETі C-M-r hRETi

Якщо ви використовуєте команди наращиваемого пошуку регулярного виразу з префіксним аргументом, вони виробляють звичайний пошук рядка, як isearch-forward і isearch-backward Див Розділ 121 [нарощуються пошук], с 87

125  Синтаксис регулярних виразів

Регулярні вирази мають синтаксис, в якому кілька знаків служать спеціальними конструкціями, а решта – це звичайні знаки Звичайний знак – це просте регулярне вираз, який відповідає цьому знаку і ніякому більше Спеціальними знаками є $, ^, .’, *, +, ?’, [, ] І \. Будь-які інші знаки, що зявляються в регулярному виразі, є звичайними, якщо тільки їм не передує \.

Наприклад, f – це Неспеціальні знак, значить він звичайний, тому f – це регулярний вираз, яке відповідає рядку f і ніякий інший (Воно не відповідає рядку ff) Аналогічно, Про – це регулярний вираз, яке відповідає тільки про. (Коли відмінності в регістрі ігноруються, ці регулярні вирази також збігаються з F і O, але ми розглядаємо це як узагальнення поняття та ж рядок, а не як виняток)

Будь-які два регулярних вирази a і b можуть бути зчеплені Результатом є регулярний вираз, що збігається з рядком, в якій a відповідає деякому початку цього рядка, а b відповідає залишку рядка

Як простий приклад ми можемо зчепити регулярні вирази f і o, щоб отримати регулярний вираз fo, яке відповідає тільки рядку fo. Поки все просто Щоб зробити щось нетривіальне, вам необхідно використовувати один із спеціальних знаків Тут представлений їх перелік

. (Точка) є спеціальним знаком, який відповідає будь-якому одиночному знаку, за винятком перекладу рядка Використовуючи конкатенацію (зчеплення), ви можете скласти регулярний вираз, подібне Ab, яке відповідає будь трехзнаковой рядку, що починається з 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 і так далі

Ви також можете включити в безліч знаків інтервали, написавши два знаки, розділені -; таким чином, [az] відповідає будь малої букві ASCII Інтервали можуть бути вільно перемішані з окремими знаками, як в [az $%], що відповідає будь малої букві ASCII, або $, або

Джерело: Річард Столмен, Керівництво по GNU Emacs

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*