Замена регулярным выражением

Автор Посетитель, 24 января 2023, 10:03

Посетитель

У меня сейчас такая задача: Регулярным выражением превратить фразу:
"Инструкция: Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены;Согласовано"
в
"Инструкция: Согласовано"
То что нужно удалить все время разное, приходится копать в сторону регулярок.

Вот пока до чего дошел - не работает.

Макрос
Sub Макрос2()

Dim strOriginal As String 'Оригинальная строка
Dim strResult As String 'Результат после замены
Dim strPattern As String 'Регулярное выражение
Dim strReplace As String 'На что меняем
strOriginal = "Инструкция: Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены;Согласовано"


strPattern = "[^;]+"

strReplace = ""
strResult = Replace(strOriginal, strPattern, strReplace)


MsgBox strResult


End Sub
[свернуть]

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

В вашем коде Replace - это функция библиотеки VBA, т.е. это VBA.Replace.
У этой функции нет возможности работать с регулярными выражениями. Вот справка по этой функции: https://learn.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/replace-function

Вам нужно использовать библиотеку: Microsoft VBScript Regular Expressions 5.5
Эта библиотека не будет работать на Mac OS, т.к. этой библиотеки нет на этой операционной системе.

Или можно использовать объект Word.Find. В самом Ворде это окно "Найти и заменить". В этом объекте есть возможность использовать регулярные выражения.

Посетитель

Я подключил Microsoft VBScript Regular Expressions 5.5
Не подскажете как сделать замену регуляркой?

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

Опишите словами, что нужно найти и на что заменить? Опишите словами, что делает это выражение: "[^;]+"

Посетитель

Ну я посчитал, что находит во фразе все, что до ";"

И еще вопрос: пытаюсь выполнить макросы с регулярками, которые нашел в интернете, но они все выдают ошибку: compile error
sub or function not defined

Посетитель

Регулярным выражением мне нужно превратить фразу:
"Инструкция: Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены;Согласовано"
в
"Инструкция: Согласовано"

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

Эта часть меняется:? Инструкция: Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены

Эта часть постоянная:? ;Согласовано

Посетитель

Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены
Эта часть все время разная. Все остальное постоянно

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

Нужно найти выражение:? Инструкция:Изменяющаяся_часть;Согласовано
И сделать:? Инструкция: Согласовано

Посетитель


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

Написал вам два письма на почту с заголовком "Письмо с Форума по VBA, Excel и Word". Написал именно на почту, а не на форум.

Может быть нет необходимости использовать объект RegExp, а достаточно использовать Word.Find.
Этот макрос делает замену в основной части документа (не в колонтитулах и других местах), во всё тексте.

Макрос
Sub Макрос()

    With ActiveDocument.Range.Find
        .Text = "(Инструкция:)(*;)(Согласовано)"
        .Replacement.Text = "\1 \3"
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
    End With

End Sub
[свернуть]

Но нужно учитывать, что если есть другие выражения, в которых есть фраза "Инструкция:", но нет "Согласовано", то будет сделана замена не там, где надо. Например, в документе десять абзацев. Первый абзац начинается "Инструкция:", но дальше в этом абзаце нет "Согласовано". А согласовано есть в десятом абзаце. То будет удалён весь текст в документе от "Инстрация:" до "Согласовано".

Тогда нужно делать замену не сразу по всему документу, а нужно двигаться по каждому абзацу и уже в каждом абзаце делать замену. Или придумать другое выражение, я пока не знаю, какое.

Посетитель

Огромное спасибо за помощь. Почту я утратил

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

Я добавил пояснения в сообщение #10.

Посетитель

Я понял, спасибо. Пытаюсь вывести результат на экран: MsgBox Text  но выводит исходную фразу

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

Не смогу помочь, спросите на другом форуме.