Думаю, все из вас хоть когда-нибудь использовали программу Microsoft Word. И, наверное, все пользовались в Ворде поиском или заменой. А вот про то, что замены бывают очень сложные, что при помощи замены можно производить необычные операции, знает далеко не каждый.
Даже в обычном режиме замены позволяют делать хитрые операции. Но вот если включить режим "подстановочные знаки" (перевод английского "wildards"), то можно творить чудеса. Об этом мы и поговорим в этой статье. Кстати, если интересуетесь, то эти самые "wildcards" очень близки к так называемым "регулярным выражениям" ("regular expressions"), используемых при поиске и замене во многих программах для автоматической обработки текста.
Давайте решим несколько задач, которые могут потребоваться, например, при составлении указателя.
Оставить на странице только слова, начинающиеся с больших букв.
Открываем окно поиска и замены, выставляем режим "подстановочные знаки" и делаем замену строки <[а-я]*> на ничто (оставляем поле "заменить на" пустым). Это в случае русского текста, в случае английского пойдет <[a-z]*>. Эта замена удаляет все слова, начинающиеся с маленькой буквы.
Объясню принцип работы этой команды. В режиме подстановочных знаков < обозначает начало слова, что-либо, написанное в квадратных скобках - это выражение на выбор. В данном случае на выбор предлагается интервал букв от маленькой а по маленькую я - всевозможные маленькие буквы. Символ звездочки обозначает сколько угодно каких угодно символов, с правая угловая скобка - конец слова. Тем самым, в поиске мы ищем, чтобы в начале слова была маленькая буква, потом сколько угодно чего угодно, и так по конец слова. Поскольку Word использует "нежадную" систему поиска, он подберет ближайший конец слова.
Сделать новые строки после слов, начинающиеся с больших букв.
Искать слова с больших букв мы уже умеем, осталось разобраться с заменой. Нам здесь понадобится возможность заменять изначальный текст на как-либо измененный. Итак, заменяем <[А-Я]*> (здесь мы ищем слова, начинающиеся с больших букв) на \&^13.
В данном случае выражение \& означает "искомый текст" - то выражение, которое вы нашли. А ^13 - это просто знак новой строки.
Но есть еще один способ сделать эту замену, опишем его сейчас, поскольку более сложные варианты этого метода нам потребуются ниже. Замените (<[А-Я]*>) на \1^13. Результат будет тот же самый.
Поясню, как это работает. Выражение в поиске может содержать несколько наборов круглых скобок, в данном случае один. Сами круглые скобки никак не влияют на поиск, ищет Word то же выражение, как если бы этих скобок не было. А вот все, что находится в скобках, нумеруется. В данном случае у нас есть только одно выражение в скобках, и оно совпадает с искомым текстом. Поэтому оно нумеруется при помощи последовательности \1.
Заменить точку на запятую в десятичных дробях
В тексте много дробей, в части из них встречаются точки, с части - запятые. Нужно навести единообразие, но просто так замену точки на запятую делать нельзя, поскольку встречаются они еще много где в тексте документа. Делаем замену последовательности (<[0-9]@).([0-9]@>) на \1,\2.
Опять-таки, объясню, как это работает. Если опустить круглые скобки, то мы получим знакомое нам начало слова, цифру. Далее идет символ @, обозначающий, что предыдущий символ может быть повторен еще сколько угодно раз. Затем идет запятая и то же самое по конец слова. Так мы находим дроби, написанные через запятую. Теперь обратим внимание на скобки. Первая пара скобок окружает часть выражения до запятой, вторая - все после запятой. Тем самым, \1 в замене будет обозначать все до запятой, а \2 - после. Вот из этих двух выражений и точки между ними мы и конструируем выражение для замены.
Убрать повторяющиеся друг за другом строки
При составлении указателя возможна ситуация, когда вы определяете, какие термины встречаются на странице, выписывая их в отдельный файл или даже воспользовавшись описанными выше удалениями слов с маленькой буквы. Итак, допустим у вас есть список терминов, встретившихся на данной странице, среди него встречаются дубликаты. Вы можете отсортировать его алфавитно, и дубликаты будут идти друг за другом. Как быстро избавиться от повторений? Очень просто! Делаем замену комбинации ^13(*)^13\1^13 на ^13\1^13.
Здесь есть, что объяснить. Мы использовали уже знакомую нам комбинацию \1, но не в замене, а в поиске. Но означает она то же самое. Итак, мы ищем последовательность, в которой идет символ новой строки, сколько угодно символов, опять перевод строки, те же символы, что были до этого, и еще один перевод строки. Это и есть то, что нам нужно, две строки с одинаковым содержимым, идущие последовательно друг за другом. А заменяем мы это выражение на одну такую строку.
Подобную замену обычно стоит прогнать несколько раз для надежности. Как это может помочь при составлении указателя? А так, что после того, как определены все термины на странице, мы можем в конце этих строк приписать номер этой страницы (сделав, например, замену ^13 на 57^13, если вы сейчас находитесь на 57 странице).
В итоге вы получите много строк типа Компьютер 57 и Интернет 60. Как же их теперь объединить?
Сложное объединение строк
После алфавитной сортировки вы получите ситуацию, когда строки с одним термином идут последовательно. Например, строка Компьютер 57 сразу идет за строкой Компьютер 51. Как же их автоматически заменить на строку вида Компьютер 51, 57? Необходимо сделать замену выражения ^13(*) ([0-9]*)^13\1 (*)^13 на ^13\1 \2, \3^13.
Что за конструкция у нас получилась? Мы ищем перевод строки, любое количество символов (они нумеруются через 1 и подразумевают под собой ключевое слово), пробел, после которого идет цифра и еще раз любое количество символов (все, что начинается с цифры, нумеруется через 2). Далее идет перевод строки, а за ним должна повторяться первая последовательность. Остаток нумеруется через 3 и заканчивается новым переводом строки. Заменяем мы это все на ключевое слово, за которым идут два остатка через запятую. Подобную замену нужно проводить несколько раз для достижения цели.
Итоги
Я постарался объяснить, как работают замены с использованием подстановочных знаков в Microsoft Word. Полный список возможных знаков я приводить не буду - вы их легко найдете в справке Word или в интернете. Ведь главное было объяснить идею, разве не так? А если что - спрашивайте!
← Дефекты фотографии | Что такое аудионаркотики? → |