Как построить регулярное выражение поиска/замены в Word 2010

Как построить регулярное выражение поиска/замены в Word 2010

У меня есть ограниченный опыт работы с базовыми регулярными выражениями JavaScript, которые я использовал для манипулирования некоторыми записями пользовательских данных. Но теперь меня спросили о манипулировании документами MS Word 2010.

В частности, мои пользователи получают длинный числовой список данных следующего вида:

1. blah blah 'car' blah blah
2. blah blah 'truck' blah blah
3. blah blah 'boat' blah blah

Это неформатированный, простой текстовый документ. Они хотели бы отформатированный заголовок после каждой цифры, на основе элемента в одинарных кавычках, аля:

1. CAR: blah blah 'car' blah blah
2. TRUCK: blah blah 'truck' blah blah
3. BOAT: blah blah 'boat' blah blah

В настоящее время у них есть транскрипционисты, которые вручную вносят эти изменения (иногда с ошибками). С помощью javascript/jQuery я мог бы написать код, который брал бы эти данные, искал бы слова в кавычках, находил бы ближайшее число перед совпадением и вставлял бы его версию, написанную ЗАГЛАВНЫМИ буквами, после точки.

Но у меня нет большого опыта работы с подобными функциями в Word. Можно ли это сделать с помощью макроса или какого-то типа скрипта? Возможно ли написать свой код javascript/jQuery и как-то запустить его в экземпляре Word?

Спасибо за руководство!

решение1

Да! Microsoft Office VBA поддерживает поиск регулярных выражений изначально. Вам нужно добавить "Microsoft VBScript Regular Expressions 5.5" в качестве ссылки в редакторе VBA для каждого файла .docm, .xlsm, и т. д., в который вы хотите поместить код Regex:

фрагмент VBA

Большую часть объектной модели для этого модуля регулярных выражений можно найти на MSDN.здесь. Единственное, чего, похоже, не хватает, так это MultiLineобстановки.

Вы используете его следующим образом:

  • Создайте новый объект регулярного выражения с помощьюDim rx as New RegExp
  • Установите флаги rx.Global, rx.MultiLine, и rx.IgnoreCaseпо желанию
  • Определите шаблон, назначив соответствующую строку шаблонаrx.Pattern
  • Если вы хотите узнать, соответствует ли что-то регулярному выражению, используйте rx.Test(str), который возвращает Trueили Falseсоответственно
  • Вызов rx.Execute(str)возвращает MatchCollectionобъект, который ведет себя как одномерный массив с нулевой нулевой нумерацией, состоящий из нуля или более Matchобъектов.
  • Matchобъекты предоставляют свойства FirstIndex, Length, Value, и SubMatches.
    • FirstIndexэто отсчитываемый от нуля индекс первого символа местоположения, в strкотором было найдено совпадение
    • Lengthдлина совпадающей частиstr
    • Valueявляется результатом сопоставления строки
    • SubMatchesпредставляет собой массив с нулевой базой данныхподгруппыв общем зачете
      • К сожалению, регулярное выражение Office VBA не поддерживает именованные группы, как, например, Python, поэтому может потребоваться метод проб и ошибок, чтобы сопоставить индекс группы с интересующей вас частью шаблона.

Я не верю, что есть способ сделать sedоперацию замены на месте в стиле - это функционал только поиска. Но достаточно просто использовать окружающий VBA, чтобы манипулировать результатами по своему усмотрению.

решение2

Если это просто текст в документе Word, и он не очень большой, и вы знакомы с jquery, вы можете создать простой сайт, куда они могут копировать/вставлять документ Word, а вы вносите необходимые изменения и позволяете им загружать преобразованный документ Word или выводить нужный текст. На самом деле, это зависит от дополнительных деталей вашей ситуации, чтобы сказать, является ли это хорошим решением.

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

решение3

Если вы не разбираетесь в скриптах VBA или Python и идея ответа @hBy2Py не соответствует вашей компетенции, попробуйте обойти это с помощью GoogleSheets/Excel, реализуя свой алгоритм:

  1. upload=import неформатированный, простой текстовый документ word=txt в G'Sheet. Допустим, ваш список будет в столбце A.
  2. в столбце B напишите вложенную формулу для всех столбцов, используя REGEXEXTRACT для слова в кавычках и сделав это слово заглавным=ARRAYFORMULA(UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)")))
  3. ...или создайте отдельный столбец C и сделайте это слово заглавным:=UPPER(B:B)
  4. в столбце C (или D) объедините новый список со словом, набранным ЗАГЛАВНЫМИ БУКВАМИ (есть несколько способов сделать это, например, путем разделения/конкатенации или просто=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&B:B&": "))

Краткий обзор:

=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)"))&": "))

Другим решением может быть использование решения, описанного здесь:Найти и заменить в Notepad++ с помощью подстановочных знаков/регулярных выражений

Связанный контент