答案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,可以进行两阶段查找和替换。
- 打开替换对话框,选择“更多>>”按钮,并打开通配符。
Al([0-9]{1,})
使用“查找内容为”和“替换为”进行替换Al++\1++
。我选择++
作为分隔符,因为它几乎肯定不会出现在您的文档中,但您可以使用几乎任何不同的分隔符。- 将“查找内容”改为
++([0-9]{1,})++
并将“替换”改为\1
。将光标保持在“替换”框中,转到“格式”菜单按钮,选择“字体...”,选择“上标”,确认对话框。然后进行替换。
如果您习惯使用 Unix、Perl、JavaScript 和其他语言的正则表达式,那么 Word 的通配符会非常奇怪。
- 括号的作用类似于传统正则表达式中的捕获组,并且替换可以对它们进行反向引用(
\1
对于第一组、\2
对于第二组等)。 - 方括号只能有字符范围,而不能有任意字符或范围。
- 它
*
的作用类似于命令行通配符而不是正则表达式,因此不能在这里使用。 - 的描述
@
让你相信它就像一个正则表达式+
,但事实并非如此,所以它也不能在这里使用。 - 花括号的作用类似于正则表达式中的花括号,因此可以在这里使用。