Для реализации второго условия подойдет строка (\d)-(\d), но для расширения функциональности ее лучше заменить на (\d) ?-|- ?(\d). Это даст воз можность расширить охват: будем искать числа, после которых может быть пробел (в подаваемом на верстку материале случается всякое), затем стоит либо либо "-", после чего опять же возможен пробел, и наконец снова идет цифра. Таким образом, мы вовлекаем в диапазон поиска значительно большее количество различных вариантов написания, тем самым замена будет универсальнее. Скобки нужны для сохранения результатов поиска при последующей замене.

Строка замены в этом случае будет выглядеть как "$i"+"\u20ll"+"$3". Она означает, что заменяемое выражение будет состоять из числа, найденного первым (которое в первых скобках соответствует "$1"), после чего вставляем неразрывное тире и дописываем второе найденное число ("$2"). Поскольку код выдается в Unicode (для универсальности), мы это отмечаем, помещая впереди комбинацию "\u" (Unicode).

Аналогичным образом для третьей замены меняем обычные пробелы вокруг тире на неразрывные (их шестнадцатеричный код до. он предваряется ключом \х).

В четвертом шаге для замены пробела после числа на неразрывный используем комбинацию \d. Соответственно строка замены будет такой: "$1"+"\хА0". Однако после чисел могут стоять множители (тыс., млн, млрд), поэтому для корректной обработки связки "число-множитель-размерность" можно воспользоваться такой цепочкой действий: сначала привяжем к цифрам размерности, а потом - сами множители. В результате для поиска получим: findl = \d;

find2 = (тысIмлнIмлрд)\.? ?; Таким образом, независимо от того, стоит после множителя точка и/или пробел, мы будем корректно отрабатывать все возможные комбинации. В этом и состоит главная прелесть регулярных выражений - они дают чрезвычайную гибкость в поиске нужных фрагментов. Строки замены в таком случае будут иметь вид: replacel = $1+\хА0 replace2 = $1+\.\хА0

Напомню, \хА0- шестнадцатеричное значение неразрывного пробела, а \. -точка (знак \ перед ней стоит, чтобы не было путаницы с - подстановочным знаком для любого символа). Кстати, для того чтобы сочетания "м2", "м3" обрабатывались корректно (после цифры оставался обычный пробел), исключим из диапазона захвата сочетание "м, идущее перед цифрой". В результате findl изменится на ([лм]) (\d) , a replacel- на "$1"+"$2"+"\хА0".

Следующий шаг - сокращения типа АО, ЗАО, АОЗТ и пр. Чтобы не разрывать форму собственности от самого названия, достаточно указать мини мальную длину искомой конструкции - 2. Поиск ведем только среди прописных букв (А-Я). В результате для поиска получим:

( [а-я] {2,)) ("|"), уточнение ("I") внесено для большей гибкости после апробации на реальных текстах, учитывает наличие кавычек, в названии организаций.

Выражение для замены:

$1+\хА0+$2

Очередной шаг в принципе не относится непосредственно к теме поиска/замены, однако он упрощает работу со списками. Предусмотрим автоматическое добавление символа левой границы текста (Indent Неге) по пробелу, следующему сразу за отбивочным знаком списка (рис. 7.1), т. е. ищем выражение л[\x95\u2013\u2014\x2d]. Знак л обеспечивает поиск только в начале строк; \х95, \u20i3, \u20i4 и \x2d- варианты отбивки (круглый маркер, табуляция, длинное тире либо дефис). Замена- на "$1"+"\и2002"+"\х07", где "\и2002"+"\х07"- коды пробела фиксированной ширины и левой границы текста соответственно. Определение значений всех спецсимволов через дополнительный скрипт и выделение было описано ранее.


⇐ вернуться назад | | далее ⇒