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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2013, 21:07   #1
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию Использование "VBScript.RegExp"

Подскажите, пожалуйста, можно ли с помощью "VBScript.RegExp" выполнить такую замену: "(стр1)(стр2)" на "(стр2)(стр1)"? Если не ошибаюсь обычно для этого используются в строке поиска круглые скобки а в строке замены "\n", но у меня почему-то не получается.
ЗарСпасБол!
Vadim39 вне форума Ответить с цитированием
Старый 28.05.2013, 21:29   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Vadim39, а почему вы решили использовать библиотеку "Microsoft VBScript Regular Expressions", а не VBA-Word-команду "Find"?
Скрипт вне форума Ответить с цитированием
Старый 28.05.2013, 22:29   #3
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Скрипт, главным образом потому, что в с помощью подстановочных знаков Word-а я могу искать "одно или более предыдущих входений", но не могу "ноль или более". А кроме того, я не знаю как использовать Find для строчной переменной. Если я правильно понимаю, эта команда может быть применена лишь к содержимому редактируемого документа, чего в моем случае хотелось бы избежать.
Vadim39 вне форума Ответить с цитированием
Старый 28.05.2013, 22:32   #4
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Vadim39, а какой у вас искомый текст, и на какой текст нужно заменить? Вот так?
До замены: "(стр1)(стр2)"
После замены: "(стр2)(стр1)"?

Или вот так?
До замены: стр1стр2
После замены: стр2стр1
Скрипт вне форума Ответить с цитированием
Старый 28.05.2013, 23:14   #5
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Не суть важно, я имел в виду самый простой пример когда искомое выражение можно подставить в строку замены. Скажем, если нужно поменять местами буквы и цифры "абв123" на "123абв" В word-е я бы написал так:
в строке поиска: "([А-я]@)([0-9]@)", а в строке замены "\2\1".

Нашел, кажется: функцию возвращения шаблона в строке замены выполняет "$n", где n - это номер скобок в строке поиска, начиная с 1. Осталось еще понять как вернуть весь найденный текст - то что в ворде обозначается так: "^&", ну и для полноты картины, как указать в строке поиска начало и конец слова, а также, узнать, возможно ли получить число замен, если ".Global = True".

Последний раз редактировалось Vadim39; 29.05.2013 в 02:52.
Vadim39 вне форума Ответить с цитированием
Старый 29.05.2013, 08:10   #6
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Vadim39, не понятно, какие у вас остались вопросы, сделайте ваши вопросы в виде списка с порядковыми номерами.
Скрипт вне форума Ответить с цитированием
Старый 29.05.2013, 11:09   #7
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Vadim39 Посмотреть сообщение
...с помощью "VBScript.RegExp" выполнить...замену...
По-простому будет так:
Код:
    With CreateObject("VBScript.RegExp")
        .Pattern = "(Стр.[0-9]+)(Стр.\d+)" ' маска поиска
        MsgBox .Replace("Стр.1Стр.2", "$2$1") ' замена
    End With
Вопрос связан не с поиском решения, а с нехваткой знаний. Забейте в поиск "VBA RegExp Microsoft Windows Script" найдете что-то типа этого:
http://msdn.microsoft.com/en-us/library/ms974570.aspx
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 29.05.2013, 18:24   #8
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Цитата:
Вопрос связан не с поиском решения, а с нехваткой знаний
Совершенно верно. Вопрос был о синтаксисе. Ни в одном описании VBScript.RegExp я не мог найти способа передачи шаблона из паттерна в строку замены. Оставшиеся вопросы:
1. Возможно ли в паттерне указать начало слова (конец слова, если не ошибаюсь, "\b").
2. Возможно ли в строке замены вернуть весь найденный текст (то, что в Word делается с помощью "^&").
3. Есть ли параметр, возвращающий число найденных вхождений/замен.

Последний раз редактировалось Vadim39; 29.05.2013 в 18:30.
Vadim39 вне форума Ответить с цитированием
Старый 29.05.2013, 19:01   #9
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Еще учтите, что буквами в RegExp считается только латиница (A-Za-z). Остальное, в том числе кириллица, - это просто знаки для параметров \b \B.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/

Последний раз редактировалось Вождь; 29.05.2013 в 19:12.
Вождь вне форума Ответить с цитированием
Старый 29.05.2013, 19:16   #10
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
Vadim39: 3. Есть ли параметр, возвращающий число найденных вхождений/замен.
Число найденных вхождений можно так узнать (для работы кода нужно подключить библиотеку: Tools - References... - Microsoft VBScript Regular Expressions 5.5):
Код:
Sub Procedure_1()
    
    'Код работает с подключением библиотеки:
        'Tools - References... - Microsoft VBScript Regular Expressions 5.5.
    
    Dim myRegExp As VBScript_RegExp_55.RegExp
    Dim myMatchCollection As VBScript_RegExp_55.MatchCollection
    Dim myString As String
    
    
    '1. помещаем в переменную текст, который нужно анализировать.
    myString = "текст текст"
    
    '2. Создаём объект "RegExp" и даём ему VBA-имя "myRegExp".
        'Через это имя можно обращаться к этому объекту.
    Set myRegExp = CreateObject(Class:="VBScript.RegExp")
    
    '3. Поиск по всему тексту, а не до первого найденного фрагмента
    myRegExp.Global = True
    
    '4. Что ищем.
    myRegExp.Pattern = "текст"
    
    '5. Выполняем поиск. Результатом поиска будет
        'объект "MatchCollection".
    Set myMatchCollection = myRegExp.Execute(myString)
    
    '6. Узнаём, сколько было найдено.
        'Вывод результата в View - Immediate Window.
    Debug.Print myMatchCollection.Count
    
End Sub

Последний раз редактировалось Скрипт; 29.05.2013 в 19:32.
Скрипт вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Visual Basic, использование операторов "for..next" и "if.. end if" Dieza Помощь студентам 0 27.10.2010 20:46
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04