1

У меня есть некоторый ограниченный опыт работы с базовыми регулярными выражениями 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 я мог бы написать некоторый код для получения этих данных, найти слова в кавычках, найти ближайший номер перед совпадением и вставить всю его версию CAPS после периода.

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

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

3 ответа3

2

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

VBA snip

Большую часть объектной модели для этого модуля регулярных выражений можно найти в 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 для манипулирования результатами по вашему желанию.

0

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

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

0

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

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

TLDR:

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .