Подстановочные знаки, условие 0 или 1 раз

Автор Николай, 13 ноября 2025, 14:16

Николай

Не могу найти способ указать условие: «0 или 1 раз». На конструкцию «{0;1}» ругается: «Неверный шаблон поиска».
Нужно описать условие: «Заглавная буква, и после неё одна строчная буква, которая может отсутствовать».

Администратор

На первый взгляд в Ворде нет такого оператора: ноль или заданное количество раз.

Николай

И поэтому, по идее, должна работать конструкция с фигурными скобками. Но с нулём она почему-то не работает...

Администратор

С нулём не работает, потому что разработчики Майкрософта не сделали такую возможность в программе Ворд.

Администратор

Если у вас эта конкретная ситуация, то приведите пример, что вы хотите сказать этим выражением:
«Заглавная буква, и после неё одна строчная буква, которая может отсутствовать»

Что именно должно искаться, что именно не должно искаться и покажите на конкретном примере.

Николай

Кратко записывая, нужно описать следующее условие (квадратные скобки в данном случае означают «может отсутствовать»):
И[м].[ ]О[т].[ ]Фамилия

Т.е.: инициалы, как правило, записываются одной заглавной буквой, но в некоторых случаях – заглавной + строчной («Дм.»). Между инициалами может стоять пробел, а может отсутствовать.

На языке регулярных выражений это записывается следующим образом:
(\u\l?\.)\s?(\u\l?\.)\s?(\u\l+\>)

Администратор

На первый взгляд в Ворде в Найти и заменить нет условий для вашей задачи.
Значит вам надо искать с помощью другого инструмента. Находите нужный фрагмент и затем уже его анализируете и вносите изменения.
Или же можно самому написать код на VBA, который будет анализировать текст. Но это делает и библиотека RegExp, поэтому на первый взгляд нет смысла что-то "городить".

Николай

Так вот с использованием RegExp мы возвращаемся к проблеме, которая обсуждалась здесь:
https://forumvba.ru/index.php?topic=2655
Если в файле, скажем, 100 раз встречается описанная конструкция, то с помощью поиска/замены мы обрабатываем её за 1 раз, а с помощью RegExp – 100-кратным циклом. Это будет жуткий тормоз.

Администратор

Хотя да, я мысленно плохо представил.
С помощью RegExp в самом документе ведь нельзя искать - нужно искать в переменной. Сначала надо поместить весь документ в переменную, а затем уже внутри переменной искать.
Но если позиции в переменной и в документе будут совпадать, тогда на первый взгляд проблем нет. Находите в переменной все вхождения, затем двигаетесь по документу с конца в начало и вносите в соответствующие позиции изменения.

Николай

Проблем, конечно, не будет – но за исключением заметной потери быстродействия.
Можно предполагать, что встроенный инструмент замены тоже 100 замен делает 100-проходным циклом, просто мы этого не видим. Но встроенный инструмент написан, очевидно, на Си или на Ассемблере. А мы наш цикл будем делать на VB, который вообще не отличается высоким быстродействием.

Администратор

Да, в Майкрософте не стали оптимизировать VBA - работает и ладно.