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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2015, 15:11   #1
Aaron20
 
Регистрация: 21.07.2015
Сообщений: 7
По умолчанию VBScript.RegExp: замена в несколько проходов

Добрый день.

Есть код
objRegExp.Global = True
objRegExp.Pattern = "^([\.\d ]*)(.+)\r([\.\d ]*)\2\r"
Res = objRegExp.Replace(Str, "$1$3$2" + vbCrLf)

Как сделать так, чтобы поиск-замена производились до тех пор, пока количество замен не станет равной нулю?

Я решил попробовать так

objRegExp.Global = True
For i = 1 To 5
objRegExp.Pattern = "^([\.\d ]*)(.+)\r([\.\d ]*)\2\r"
Res = objRegExp.Replace(Str, "$1$3$2" + vbCrLf)
Next

но не получилось.
Aaron20 вне форума Ответить с цитированием
Старый 21.07.2015, 18:49   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

А обычной заменой в Word?
Sasha_Smirnov вне форума Ответить с цитированием
Старый 21.07.2015, 20:42   #3
Aaron20
 
Регистрация: 21.07.2015
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
А обычной заменой в Word?
Это только фрагмент макроса, который хочу написать.

Если бы речь шла просто о разовой замене, то я бы заменил, естественно, обычными средствами ворда.
Aaron20 вне форума Ответить с цитированием
Старый 23.07.2015, 18:55   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Цитата:
Сообщение от Aaron20 Посмотреть сообщение
Как сделать так, чтобы поиск-замена производились до тех пор, пока количество замен не станет равной нулю?
То есть замену нужно применять к результату предыдущей замены?
В простейшем случае так
Код:
While objRegExp.test(Str)
  Str = objRegExp.Replace(Str, "$1$3$2" + vbCrLf)
Wend
Но поскольку тут происходит перемена местами частей строки, есть шанс, что всегда будет что заменить, и программа зациклится. Поэтому следует ограничить число замен, например так
Код:
For i = 1 To 10 'макс. 10 замен
  If objRegExp.test(Str) Then
    Str = objRegExp.Replace(Str, "$1$3$2" + vbCrLf)
  Else: GoTo allReplaced
  End If
Next
MsgBox "проведено 10 замен, результат не достигнут!", vbExclamation
allReplaced: 'продолжение программы
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 23.07.2015, 20:51   #5
Aaron20
 
Регистрация: 21.07.2015
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
есть шанс, что всегда будет что заменить, и программа зациклится
[/CODE]
В моем случае не зациклится. Там фактически максимум нужно будет 5-7 проходов.
Aaron20 вне форума Ответить с цитированием
Старый 26.07.2015, 20:30   #6
Aaron20
 
Регистрация: 21.07.2015
Сообщений: 7
По умолчанию

Не получается, увы (
Aaron20 вне форума Ответить с цитированием
Старый 26.07.2015, 20:32   #7
Aaron20
 
Регистрация: 21.07.2015
Сообщений: 7
По умолчанию

В общем, кода такой пока что.

Sub Regularka()
'Объявляем переменные и классы
Set objRegExp = CreateObject("VBScript.RegExp")
Dim Str, Result As String

'Копируем выделенный текст в строковую переменную и удаляем из текста.
Str = Selection.text
Selection.Delete
'Проверять по всему тексту (если бы False, то было бы до первого соответствия).
objRegExp.Global = True
'Регулярное выражение, ищущее строку (время + название передачи)
objRegExp.Pattern = "^([\.\d ]*)(.+)\r([\.\d ]*)\2\r"
For i = 1 To 5
Result = objRegExp.Replace(Str, "$1$3$2" + vbCrLf)
Str = Result
Next
Selection.TypeText text:=Str
End Sub
==============
А текст в документе ворда такой (просто пример):

17.23 Новости
12.22 Новости
22.00 Новости
12.12 Новости
Aaron20 вне форума Ответить с цитированием
Старый 26.07.2015, 21:37   #8
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Выложите документ с реальными данными (расширенный режим - скрепка), и что надо получить. Похоже, тут лучше использовать коллекцию или словарь, а не регэксп.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 27.07.2015, 11:22   #9
Aaron20
 
Регистрация: 21.07.2015
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Выложите документ с реальными данными (расширенный режим - скрепка), и что надо получить. Похоже, тут лучше использовать коллекцию или словарь, а не регэксп.
Так это пока и есть весь макрос.
И текст в будущем будет такой же ("Новости" и т.п.)
Там еще непонятность есть -- если например первая строчка будет немного другая, то макрос вообще ничего не заменяет:

17.23 Новоооости
12.22 Новости
22.00 Новости
12.12 Новости

Хотя регулярное выражение должно находить в этом случае вторую и третью строки.
Aaron20 вне форума Ответить с цитированием
Старый 27.07.2015, 11:22   #10
Aaron20
 
Регистрация: 21.07.2015
Сообщений: 7
По умолчанию

Что такое коллекция? )
Aaron20 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена TXT1 на TXT2 в Selection при условии, что их (TXT2) там м.б. несколько DBEER Microsoft Office Word 9 03.02.2015 15:37
Regexp Fahman Общие вопросы Delphi 27 22.06.2014 18:06
Использование "VBScript.RegExp" Vadim39 Microsoft Office Word 15 30.05.2013 08:38
TRegExpr: замена несколько раз в строке разными значениями, как? trafbite Общие вопросы Delphi 5 22.06.2012 21:33
regexp в С++ Пепел Феникса Общие вопросы C/C++ 2 10.11.2010 18:26