正则表达式 – 在单词/ VBA中查找具有多个大写字母的单词

我有一段VBA代码使用
Find来查找文档中的所有首字母缩略词.它通过搜索包含2个或更多字符的大写字母组成的所有单词来完成此操作…

<[A-Z]{2,}>

这个问题是它没有拿起所有的首字母缩略词,如CoP,W3C,DVD和CD-ROM.它在两个部分中拾取带连字符的首字母缩略词,这些部分不理想但允许由用户检查列表.我也可以选择以“s”或其他字符结尾的单词,而不是使用…来搜索单词的结尾.

<[A-Z]{2,}

但是这不会将任何非大写字符视为它找到的单词的一部分.

是否有表达式允许我在任何位置搜索具有两个或更多大写字母的单词并找到整个单词?

最佳答案 我认为不可能“在任何位置搜索带有两个或更多大写字母的单词并找到整个单词”,除非与宏代码结合使用.既然你正在使用宏,无论如何,这是一种使用以下示例文本对我有用的方法

CoP, this That and AnoTher thing W3C, DVDs and CD-ROM

和这个通配符组合(请注意,我的Windows配置中的列表分隔符是;,对于其他区域a,可能是必需的).

<[A-Z][0-9A-Z\-a-z]{1;10}>

以下函数检查“found”范围中的第二个或任何后面的字母是否大写,并向调用过程返回一个布尔值.它循环遍历给定Range中的字符,检查ASCII值.一旦找到,循环就会退出.

Function ContainsMoreThanOneUpperCase(rng As Word.Range) As Boolean
    Dim nrChars As Long, i As Long
    Dim char As String
    Dim HasUpperCase

    HasUpperCase = False
    nrChars = rng.Characters.Count
    For i = 2 To nrChars
        char = rng.Characters(i).text
        If Asc(char) >= 65 And Asc(char) <= 90 Then
            'It's an uppercase letter
            HasUpperCase = True
            Exit For
        End If
    Next
    ContainsMoreThanOneUpperCase = HasUpperCase
End Function

使用它的一个例子:

Sub FindAcronyms()
    Dim rngFind As Word.Range
    Dim bFound As Boolean

    Set rngFind = ActiveDocument.content
    With rngFind.Find
        .text = "<[A-Z][0-9A-Z\-a-z]{1;10}>"
        .MatchWildcards = True
        .Forward = True
        .wrap = wdFindStop
        bFound = .Execute
        Do While bFound
            If bFound And ContainsMoreThanOneUpperCase(rngFind) Then
                Debug.Print rngFind.text
                rngFind.HighlightColorIndex = wdBrightGreen
            End If
            rngFind.Collapse wdCollapseEnd
            bFound = .Execute
        Loop
    End With
End Sub
点赞