将上标应用于某个字符串之后出现的所有十进制数字?

将上标应用于某个字符串之后出现的所有十进制数字?

假设我在 Microsoft Word 2016 中有一个这样的字符串:

道过存在Al2V3和Al50V50这两Al20种

现在我想选择Al

在此处输入图片描述

并对这些数字应用上标格式?

我认为我应该在 Word 中使用 RegEx 进行查找和替换,但我不知道如何实现这一点。

有什么建议么?

答案1

一开始我想基于正则表达式来解决这个问题。写这样的表达式没什么大不了的,但是上标是一个属性。无法使用正则表达式将一个属性替换为另一个属性。可以使用 RegExp.Execute 代替 RegExp.Replace,它可以查找所有出现的情况,但此方法不会保存有关每次出现的位置和长度的信息。

我没有使用正则表达式,而是使用循环来遍历整个文本。首先,代码确定要更改的内容,然后在第二个循环中应用更改。这是按照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

答案2

如果您不想使用 VBA,可以进行两阶段查找和替换。

  1. 打开替换对话框,选择“更多>>”按钮,并打开通配符。
  2. Al([0-9]{1,})使用“查找内容为”和“替换为”进行替换Al++\1++。我选择++作为分隔符,因为它几乎肯定不会出现在您的文档中,但您可以使用几乎任何不同的分隔符。
  3. 将“查找内容”改为++([0-9]{1,})++并将“替换”改为\1。将光标保持在“替换”框中,转到“格式”菜单按钮,选择“字体...”,选择“上标”,确认对话框。然后进行替换。

如果您习惯使用 Unix、Perl、JavaScript 和其他语言的正则表达式,那么 Word 的通配符会非常奇怪。

  • 括号的作用类似于传统正则表达式中的捕获组,并且替换可以对它们进行反向引用(\1对于第一组、\2对于第二组等)。
  • 方括号只能有字符范围,而不能有任意字符或范围。
  • *的作用类似于命令行通配符而不是正则表达式,因此不能在这里使用。
  • 的描述@让你相信它就像一个正则表达式+,但事实并非如此,所以它也不能在这里使用。
  • 花括号的作用类似于正则表达式中的花括号,因此可以在这里使用。

相关内容