1

Предположим, у меня есть строка в Microsoft Word 2016, например:

道过存在Al2V3和Al50V50这两Al20种

Теперь я хочу выбрать все десятичные цифры после Al как

и применить форматирование Superscript к этим цифрам?

Я думаю, что я должен использовать Find и Replace с RegEx в Word, но я не могу понять, как это реализовать.

Какие-либо предложения?

2 ответа2

0

Если вы не хотите использовать VBA, вы можете выполнить двухэтапный поиск и замену.

  1. Откройте диалоговое окно "Заменить", нажмите кнопку «Дополнительно >>» и включите подстановочные знаки.
  2. Выполните замену с помощью команды «Найти как Al([0-9]{1,}) и «Заменить как Al++\1++ . Я выбрал ++ в качестве разделителя, потому что он почти наверняка не появится в вашем документе, но вы можете использовать что угодно.
  3. Заменить Find What на ++([0-9]{1,})++ и заменить на \1 . Удерживая курсор в поле "Заменить", перейдите к кнопке меню "Формат", выберите «Шрифт ...», выберите "Верхний индекс" и подтвердите диалоговое окно. Затем сделайте замену.

Подстановочные знаки Word очень странные, если вы привыкли к регулярным выражениям из Unix, Perl, JavaScript и других.

  • Круглые скобки действуют как группы захвата в традиционных регулярных выражениях, и замена может иметь обратные ссылки на них (\1 для первой группы, \2 для второй группы и т.д.).
  • Квадратные скобки могут иметь только диапазон символов, а не произвольные символы или диапазоны.
  • * Действует так же, как в подстановочных знаках командной строки, а не в регулярных выражениях, поэтому его нельзя использовать здесь.
  • Описание @ заставляет вас поверить, что оно похоже на регулярное выражение + , но это не так, поэтому его также нельзя использовать здесь.
  • Фигурные скобки действуют как фигурные скобки в регулярном выражении, поэтому их можно использовать здесь.
0

Сначала я хотел основать решение на регулярных выражениях. Написать такое выражение не имеет большого значения, но Superscript - это свойство. Невозможно заменить свойство другим, используя регулярное выражение. Вместо RegExp.Replace можно использовать RegExp.Execute, который находит все вхождения, но этот метод не сохраняет информацию о позиции и длине каждого вхождения.

Вместо регулярных выражений я просто использовал цикл для перебора всего текста. Сначала код определяет, что нужно изменить, а во втором цикле применяет изменения. Это делается в соответствии со ссылкой msdn « На панели окна документа может быть только один объект Selection, и только один объект Selection во всем приложении может быть активным. »

Option Explicit
Sub toSuperscript()
    Dim al As String
    Dim alPosition As Integer
    Dim alOcc As String 'Al occurence
    Dim strTemp As String
    Dim strTemp_len As Integer
    Dim counter As Integer
    Dim subCounter As Integer
    Dim c As New Collection 'start
    Dim c1 As New Collection 'length

    al = "Al" 'the searched string
    ActiveDocument.Select
    strTemp = Selection.Text
    strTemp_len = Len(strTemp)

    'search for Al
    For counter = 1 To strTemp_len
        alOcc = Mid(strTemp, counter, 2) '2 as Al is characters long
        If StrComp(CStr(alOcc), CStr(al), vbBinaryCompare) = 0 Then
            subCounter = 0
            Do Until IsNumeric(Mid(strTemp, counter + 2, subCounter + 1)) = False
                subCounter = subCounter + 1
            Loop
                c.Add CStr(counter + 2) 'start
                c1.Add CStr(subCounter) 'length
        End If
    Next counter

    'Apply superscript
    For counter = 1 To c.Count
         ActiveDocument.Range(Start:=c.Item(counter) - 1, End:=CInt(c.Item(counter)) + CInt(c1.Item(counter)) - 1).Font.superscript = True
    Next counter
    Application.Selection.StartOf 'Put the cursor at the beginning of the document (optional)
End Sub

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