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