Занимался вот намедни всяческими сексуальными извращениями с текстами очередных аффтаров от медицины в MS Word. И нужно мне было искать и заменять кучу всякой нецензурщины и тарабарщины, ибо аффтары, по большей своей части, русскому языку вовсе не обучены плохо (всё на аглицком кириллицей норовят писать и прочее) и тексты форматировать читабельно не умеют. Заменять и просто менять там нужно было очень много чего, а стандартных общеизвестных встроенных в редактор средств поиска стало не хватать, нужно было прибегать к использованию
регулярных выражений. А как? На известные мне ранее маски волшебная программа Word стала грязно ругаться матом. Как всегда выручил Гугл. Немного покопавшись я обнаружил, что гениальные мелкомягкие написатели MS Office и тут пошли своим путём, обозвав такие выражения
wildcards и немного изменив их синтаксис. В целом разобраться можно.
Оказалось всё довольно просто (у меня Office 2007, но, думаю, будет справедливо и для предыдущих версий, разве что будут незначительные отличия в названиях пунктов, но вы разберётесь, я верю ;)). И не нужно было, по большому счёту, никуда лезть искать. Наряду со сразу видимыми, если вызвать в Word'е окно «Поиск» (Ctrl+F) или «Поиск и замена» (Ctrl+H), поставить курсор в поле «Найти» и нажать кнопочку «Больше», а после "Специальный», спецсимволами, есть и ещё одна опция, о которой чуть ниже.Оказалось всё довольно просто (у меня Office 2007, но, думаю, будет справедливо и для предыдущих версий, разве что будут незначительные отличия в названиях пунктов, но вы разберётесь, я верю ;)). И не нужно было, по большому счёту, никуда лезть искать. Наряду со сразу видимыми, если вызвать в Word'е окно «Поиск» (Ctrl+F) или «Поиск и замена» (Ctrl+H), поставить курсор в поле «Найти» и нажать кнопочку «Больше», а после «Специальный», спецсимволами, есть и ещё одна опция, о которой чуть ниже.
Сперва о стандартных масках поиска:
^? - любой знак
^# - любая цифра
^$ - любая буква
^p - Знак абзаца (¶) (если выбран параметр «Подстановочные знаки» следует заменить на ^13)
^t - знак табуляции (→) (если выбран параметр «Подстановочные знаки» следует заменить на ^9)
^+ - длинное тире ( - )
^= - короткое тире ( - )
^^ - знак крышки (^)
^l - принудительный разрыв строки (символ ↵ или 0xBF), такой бывает если нажать Shift+Enter (если выбран параметр «Подстановочные знаки» следует заменить на ^11)
^n - разрыв колонки (если выбран параметр «Подстановочные знаки» следует заменить на ^14)
^12 - Разрыв раздела или страницы (при замене добавляет разрыв страницы)
^m - Принудительный разрыв страницы (применяется также для поиска и замены разрывов разделов, если выбран параметр «Подстановочные знаки»)
^s - неразрывный пробел (º) (Ctrl+Shift+Space)
^~ - неразрывный дефис (≈)
^- - мягкий перенос (¬)
Теперь перейдём к полю «Заменить на», тут появляются две специфические опции:
^& - искомый текст
^c - содержимое буфера обмена
Как это можно использовать? Например так - пусть нужно найти текст «Achtung!» и «Achtung.»? покрасить его в зелёный и заменить на «Achtung, minen!» (именно красного цвета). Причём в тексте у вас есть и просто слово «achtung» с маленькой буквы, которое менять не нужно. Решение:
Написать красным «minen!» и вырезать в буфер обмена
Найти (отметив галочку «Учитывать регистр»): Achtung
Заменить на (переставить курсор на это поле и нажать кнопку «Формат», затем выбрать «Шрифт» и там зелёный):
Теперь Найти: Achtung^?
Заменить на: Achtung, ^c
С этим всё действительно просто и понятно. А если нужно в огромном списке литературы вида
Reynolds J. V., Murchan P., Leonard N. et al. High-dose interlenkin-2 promotes bacterial translocation from the gut // Brit. J. Cancer.-1995. -Vol. 72, N 3. - P. 634-636.
привести всё к нормальному виду
ReynoldsºJ.V., MurchanºP., LeonardºN. etºal. High-dose interlenkin-2 promotes bacterial translocation from the gut // Brit. J. Cancer.º- 1995.º- V.72(3).º- P.º634-636.
Как быть? Ручками править в каждой строчке всё это будет очень долго и утомительно. Но это тоже можно сделать поиском и заменой.
Если отметить в окне поиска и замены галочку «Подстановочные знаки», то содержимое кнопки «Специальный» для поля «Найти» примет несколько иной вид:
? - любой знак
[ - ] - знак в диапазоне
< - в начале слова
> - в конце слова
() - диапазон
[!] - не
{; } - число вхождений
@ - предыдущий 1 или более
* - любое число знаков
А для поля «Заменить на» появится дополнительный пункт
\n - искомое выражение
Как этим пользоваться? Просто. Начну почти по порядку.
? и * - по сути одно и то же, но выражение ??са будет для поиска значить «[пробел]оса», «коса», «лиса» и ещё кучу всего, содержащего два символа впереди «са». А выражение *са выделит вам весь текст от положения курсора в тексте до первого попавшегося «са», в том числе и «[курсор]По полю бежало животное с номером 25, это была лиса».
Близок по смыслу к предыдущим и символ @. Тут фантазии на пример у меня не хватило, заимствую у мелкомягких: lo@t поможет найти «lot» или «loot», ful@ поможет найти «ful» или «full» и т.д. :)
Почти из той же оперы символы < и >: <ок поможет найти все «около», а ок> - всевозможный «шок».
Выражение [A-Z] поможет найти любую букву английского алфавита в верхнем регистре, а [A-я] - любую букву и русского и английского. Неразрывно с этим используется и выражение {; }. Выглядит это так: допустим, нужно найти все слова, начинающиеся с заглавной буквы и длиной от 4 до 5 букв и заканчивающиеся вопросительным знаком. Решением будет искать их по следующей маске:
[A-Я]{1;1}[a-я]{3;4}\?
то есть найти одну заглавную букву и ещё 3 или 4 следующих за ней строчных плюс вопросительный знак. Тут есть одна маленькая тонкость - так как символ «?» используется как подстановочный, то, чтобы поиск его воспринял за знак вопроса, а не любой символ перед ним нужно поставить «\». Если нужно найти сам символ «\» в тексте, то это будет выглядеть как \\, ну и т.д.
При помощи [!] можно найти например всё кроме заглавных букв: [!A-Я].
Теперь о самом наверное интересном операторе поиска - (). При его помощи можно находить несколько разных выражений и группировать их при помощи оператора \n. Простой пример: пусть вам нужно по всему тексту заменить «Фамилия И О» на «И.О.ºФамилия». Решение:
Найти: ([A-Я]{1;1}[a-я]{2;11}) ([A-Я]{1;1}) ([A-Я]{1;1})
Заменить на: \2.\3.^s\1
То есть каждое выражение в скобках в поле «Найти» соответствует по порядку оператору \n в поле «Заменить на».
Теперь с заданной выше задачей я думаю вы справитесь и сами ;)
P.S. Я желаю долгого здравия и личного счастья всем разработчикам «Визуального редактора» постов в ЖЖ. Пришлось копировать весь сгенерированный код в обычный блокнот и править всё ручками... Страницы, сгенерированные MS Word выглядят лучше чем ЭТО. Какое уж тут соблюдение стандартов HTML...