Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2010, 15:37   #1
Suppir
 
Регистрация: 02.02.2010
Сообщений: 8
По умолчанию Поддерживает ли VBA регулярные выражения?

Добрый день!

У меня следующий вопрос. Есть большое количество регулярных выражений в формате PCRE (а-ля Perl), и я хочу заставить их работать в Word'овских документах. Поддерживает ли VBA регулярные выражения?

Пример выражения:

Найти:^\s+(\d+).?(\S)
Заменить на:$1. $2
Suppir вне форума Ответить с цитированием
Старый 02.02.2010, 16:10   #2
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Сам VBA регулярные выражения не поддерживает. Но ничто не мешает подключить к проекту библиотеку Microsoft VBScript Regular Expression 5.5 или создавать динамически объект vbscript.regexp, используя позднее связывание.
Код:
Dim RegEx as Object
Dim TestStr as String
Set RegEx = CreateObject("vbscript.regexp")
' set the RegExp parameters
With RegEx
      .MultiLine = False
      .Global = True
      .IgnoreCase = True
      .Pattern = "(\d+)([a-z]+)"
End With
TestStr = ActiveDocument.Content
 ' create the collection of matches
Set RegMatchCollection = RegEx.Execute(TestStr)
и т.д.
Cм:
http://dotnetslackers.com/community/...with-Word.aspx
http://windowsdevcenter.com/pub/a/wi...l?page=4%22%22

Часто однако удобнее воспользоваться теми родными средствами использования подстановочных знаков которые представляет сам Word для Find/Replace

Последний раз редактировалось Aent; 02.02.2010 в 16:19.
Aent вне форума Ответить с цитированием
Старый 02.02.2010, 16:22   #3
Suppir
 
Регистрация: 02.02.2010
Сообщений: 8
По умолчанию

Ясно, спасибо! Еще вопрос:

работают ли такие регулярные выражения в таблицах Word.

Я пробовал делать поиск-замену напрямую в буфере обмена, содержащего вордовский текст. При этом, если текст был без таблиц, то все было нормально. Но если текст был с таблицами, то они "разрушались" в плоский текст. Спасибо
Suppir вне форума Ответить с цитированием
Старый 02.02.2010, 17:03   #4
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Неправильная постановка вопроса. vbscript.regexp работает со строками
(плоским нетатрибутированным текстом). Содержание документа Word это
куда боолее сложная структура. Когда вы выбираете текст из ранга в строку, то, естественно, вся разметка теряется.
Как я уже советовал, используйте объект Find MS Word.
Aent вне форума Ответить с цитированием
Старый 02.02.2010, 17:33   #5
Suppir
 
Регистрация: 02.02.2010
Сообщений: 8
По умолчанию

В этом-то вся и проблема... Find/Replace сильно ограничен в средствах по сравнению с регулярными выражениями. Спасибо за ответ.
Suppir вне форума Ответить с цитированием
Старый 02.02.2010, 18:26   #6
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Сохраните ваш документ в формате XML или HTML и после этого обрабатывайте получившийся файл как плоский текст.
Или идите в цикле по элементам коллекции Selection.Tables и для каждой таблицы в цикле по ячейкам. Выбирайте текстовку
ячейки и к ней применяйте RegExp. Хотя проблемы с форматированием текста никуда не исчезнут. Впрочем можно организовать замену через элементы коллекции Characters для рангов ячеек.

Последний раз редактировалось Aent; 02.02.2010 в 18:36.
Aent вне форума Ответить с цитированием
Старый 02.02.2010, 22:50   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Поиск и замена: подстановочные знаки

Цитата:
Сообщение от Suppir Посмотреть сообщение
В этом-то вся и проблема... Find/Replace сильно ограничен в средствах по сравнению с регулярными выражениями.
Отнюдь! Вот 1-я же ссылка по запросу «Word +"поиск и замена"».

Найдётся всё что нужно. Пример как это делать программно — вот здесь.

Если у вас есть Word 97, то там в справке всё описано (по-русски).

Последний раз редактировалось Sasha_Smirnov; 03.02.2010 в 11:38. Причина: -
Sasha_Smirnov вне форума Ответить с цитированием
Старый 03.02.2010, 11:59   #8
Suppir
 
Регистрация: 02.02.2010
Сообщений: 8
По умолчанию

Aent, спасибо, попробую этот вариант.
Sasha_Smirnov, я пробовал поиск-замену в ворде. Там нет даже сохранения найденного в переменную (только программно, через vba), не говоря уже о минимальных или захватывающих квантификаторах, отрицательных классов, упреждающих проверок, исполнения кода на фрагменте и других функций, которые часто нужны в работе. Все это есть в .NET, но, насколько я понял, VBA с .NET не работает.
Suppir вне форума Ответить с цитированием
Старый 03.02.2010, 12:18   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Да... А на днях я здесь узнал про VB .NET. (Видимо, это бэйсик для инета?..)

То, что вы перечислили, впечатляет. Но всё же VBA (оператор Like и подстановки в нём) может многое.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 03.02.2010, 12:50   #10
Suppir
 
Регистрация: 02.02.2010
Сообщений: 8
По умолчанию

Sasha_Smirnov, если вы хорошо владеете поиском-заменой, то скажите ваше мнение.

Вот, например, регулярные выражения для поиска (я пока не говорю о замене, там все сложней) ошибок из одного моего скрипта. Они на Perl (в принципе, все это будет работать в .NET, если перевести)

e "спаренные кавычки" if /""/;
e "три апострофа" if /'''/;
e "смесь апострофов и кавычек "if /"'|'"/;
e "нетипичный апостроф" if /[^'\d]'[^s]/ && !/О'|Д'|точк|TCO/;
e "нетипичная кавычка" if /\d["]\d/;
e "сдвоенные знаки препинания" if /,[,.]/ && !/,\.{3}/;
e "запятая не отделена пробелом" if /$r\s*,+$r/ && !/│/;
e "знак препинания отделен от слова" if /^$r.+\s[,.:;!?](?!\.\.)/ && !/__|\d\s+:\s+\d/ && !/:/;
e "нет пробела после номера пункта (или неверно распознана цифра)" if /^\s*\d+\.$r/;
e "цифровой ряд не разделен пробелами" if /\d+,\d+,\d/;
e "в ряде цифр пропущена запятая" if /\d\s+\d/ && !/|\d[,-:\.]\d|-го/ && /\d+,\s+\d+,/;
e "строка содержит повторяющиеся слова" if /\s($r+)\s{1,7}\1\s/g && /$r{5,}/ && !/\s{9}/;
e "диапазон дат записан через дефис" if /\D\d{4}-\d{4}\D/ && !/ГОСТ|│/;
e "год не отделен от цифры" if /\d{4}г./ && !/│/;
e "не проставлена ссылка на сайт" if /\s(http:\/\/)?www\./ && /$r{2,} /&& !/сайт/;
e "ошибка в диапазоне чисел" if /\d\s+-\d|\d-\s+\d/ && !/"/;
e "склеенный номер" if /\sN\d+/;
e "неверная запись суммы" if /(тыс|млн|млрд)\.р/ && !/│/;;
e "ошибка в сокращениях" if !/│/ && /(г|ул|р-н)\.$br$lr|(^| )(п|ст|гл)\.(\d)/;
e "инициалы написаны слитно" if !/__|│|подпись/ && /$br\.$br\.$br$lr+/;
e "ошибка форматирования в таблице" if /│\s*[,;:\.]/ & !/\.\.\./;

Легко ли их будет реализовать с помощью функции поиск в MS Word?

Последний раз редактировалось Suppir; 03.02.2010 в 13:42.
Suppir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поддерживает ли MS Access регулярные выражения? Саня Microsoft Office Access 2 13.11.2010 00:12
Регулярные выражения Marsik Помощь студентам 4 14.11.2009 14:13
Регулярные выражения AnalogXP Общие вопросы Delphi 0 01.08.2009 23:12
Регулярные выражения Adamant Общие вопросы C/C++ 1 26.11.2007 19:44