|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
02.02.2010, 15:37 | #1 |
Регистрация: 02.02.2010
Сообщений: 8
|
Поддерживает ли VBA регулярные выражения?
Добрый день!
У меня следующий вопрос. Есть большое количество регулярных выражений в формате PCRE (а-ля Perl), и я хочу заставить их работать в Word'овских документах. Поддерживает ли VBA регулярные выражения? Пример выражения: Найти:^\s+(\d+).?(\S) Заменить на:$1. $2 |
02.02.2010, 16:10 | #2 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
Сам VBA регулярные выражения не поддерживает. Но ничто не мешает подключить к проекту библиотеку Microsoft VBScript Regular Expression 5.5 или создавать динамически объект vbscript.regexp, используя позднее связывание.
Код:
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. |
02.02.2010, 16:22 | #3 |
Регистрация: 02.02.2010
Сообщений: 8
|
Ясно, спасибо! Еще вопрос:
работают ли такие регулярные выражения в таблицах Word. Я пробовал делать поиск-замену напрямую в буфере обмена, содержащего вордовский текст. При этом, если текст был без таблиц, то все было нормально. Но если текст был с таблицами, то они "разрушались" в плоский текст. Спасибо |
02.02.2010, 17:03 | #4 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
Неправильная постановка вопроса. vbscript.regexp работает со строками
(плоским нетатрибутированным текстом). Содержание документа Word это куда боолее сложная структура. Когда вы выбираете текст из ранга в строку, то, естественно, вся разметка теряется. Как я уже советовал, используйте объект Find MS Word. |
02.02.2010, 17:33 | #5 |
Регистрация: 02.02.2010
Сообщений: 8
|
В этом-то вся и проблема... Find/Replace сильно ограничен в средствах по сравнению с регулярными выражениями. Спасибо за ответ.
|
02.02.2010, 18:26 | #6 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
Сохраните ваш документ в формате XML или HTML и после этого обрабатывайте получившийся файл как плоский текст.
Или идите в цикле по элементам коллекции Selection.Tables и для каждой таблицы в цикле по ячейкам. Выбирайте текстовку ячейки и к ней применяйте RegExp. Хотя проблемы с форматированием текста никуда не исчезнут. Впрочем можно организовать замену через элементы коллекции Characters для рангов ячеек. Последний раз редактировалось Aent; 02.02.2010 в 18:36. |
02.02.2010, 22:50 | #7 | |
Особый статус
Участник клуба
Регистрация: 24.11.2008
Сообщений: 1,535
|
Поиск и замена: подстановочные знаки
Цитата:
Найдётся всё что нужно. Пример как это делать программно — вот здесь. Если у вас есть Word 97, то там в справке всё описано (по-русски).
Формула 1 (календарь чемпионата-2016): 26.11.2016 15:55 — Абу-Даби: http://ru.wikipedia.org/wiki/Гран-при_Абу-Даби — (квалификация)! Эфир: http://lion-tv.com/28-match-tv.html
Последний раз редактировалось Sasha_Smirnov; 03.02.2010 в 11:38. Причина: - |
|
03.02.2010, 11:59 | #8 |
Регистрация: 02.02.2010
Сообщений: 8
|
Aent, спасибо, попробую этот вариант.
Sasha_Smirnov, я пробовал поиск-замену в ворде. Там нет даже сохранения найденного в переменную (только программно, через vba), не говоря уже о минимальных или захватывающих квантификаторах, отрицательных классов, упреждающих проверок, исполнения кода на фрагменте и других функций, которые часто нужны в работе. Все это есть в .NET, но, насколько я понял, VBA с .NET не работает. |
03.02.2010, 12:18 | #9 |
Особый статус
Участник клуба
Регистрация: 24.11.2008
Сообщений: 1,535
|
Да... А на днях я здесь узнал про VB .NET. (Видимо, это бэйсик для инета?..)
То, что вы перечислили, впечатляет. Но всё же VBA (оператор Like и подстановки в нём) может многое.
Формула 1 (календарь чемпионата-2016): 26.11.2016 15:55 — Абу-Даби: http://ru.wikipedia.org/wiki/Гран-при_Абу-Даби — (квалификация)! Эфир: http://lion-tv.com/28-match-tv.html
|
03.02.2010, 12:50 | #10 |
Регистрация: 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. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поддерживает ли 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 |