【问题标题】:Creating a RegEx to find a sentence with a parenthetical acronym (VBasic Word)创建正则表达式以查找带有括号首字母缩写词的句子(VBasic Word)
【发布时间】:2017-05-04 23:23:05
【问题描述】:

我正在编写一个脚本,用于清理文档以查找格式中的首字母缩略词(美国)。作为一种处理工具,我需要抓取出现括号首字母缩略词的整个句子。现在我查找首字母缩写词的代码是:

With oRange.Find
        .Text = "\([A-Z]{2,}\)"
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = True
        .MatchWildcards = True

将此与 Do While .Execute 结合起来,我可以梳理文档并找到首字母缩略词,然后使用字符串函数将首字母缩略词从括号中取出并将其放入表格中。是否有我可以使用的 RegEx 可以找到(美国)类型首字母缩略词所在的任何句子?作为输入,您可以使用此段落。

非常感谢。

编辑:我找到了以下正则表达式来尝试使其工作:

.Text = "[^.]*\([A-Z]{2,}\)[^.]*\."

但这给了我一个错误,说胡萝卜不能在 Find 函数中使用。

【问题讨论】:

  • 我会尝试[^.]*([\(][A-Z]{2,}[\)])[^.]*[\.],不确定.Find 是否可以直接处理正则表达式,所以你可能需要look at this answer! ;)
  • 这个正则表达式给我一个错误“编译错误:预期:)”。我认为查找工作正常,我只是不确定如何构建正则表达式。
  • 你能发布一些例子吗?首字母缩略词
  • @Nate:你成功了吗?请使用 tour(单击链接),以便了解 SO 的工作原理(投票、接受答案……)。谢谢!
  • 我能够使用下面的答案。

标签: regex vba find ms-word


【解决方案1】:

我没有设法在.Find 方法中直接使用那个正则表达式,所以直接使用正则表达式:

Sub AcronymFinder()
    Dim Para As Paragraph
    Set Para = ThisDocument.Paragraphs.First
    Dim ParaNext As Paragraph
    Dim oRange As Range
    Set oRange = Para.Range
    Dim regEx As New RegExp
    Dim ACrO As String

    With regEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = ".*[^.]*([\(][A-Z]{2,}[\)])[^.]*[\.]"
    End With

    Do While Not Para Is Nothing
        Set ParaNext = Para.Next
        Set oRange = Para.Range
        'Debug.Print oRange.Text
        If regEx.test(oRange.Text) Then
            ACrO = CStr(regEx.Execute(oRange.Text)(0))
            'Debug.Print ACrO
            With oRange.Find
                .Text = ACrO
                .Forward = True
                .Wrap = wdFindStop
                .Format = False
                .MatchCase = True
                .MatchWildcards = False
                .Execute
            End With
        Else
        End If
        Set Para = ParaNext
    Loop
End Sub

要使用它,记得添加参考:

Description: Microsoft VBScript Regular Expressions 5.5
FullPath: C:\windows\SysWOW64\vbscript.dll\3
Major.Minor: 5.5
Name: VBScript_RegExp_55
GUID: {3F4DACA7-160D-11D2-A8E9-00104B365C9F}

【讨论】:

    【解决方案2】:

    这个正则表达式

    [^046][!^046]*\([A-Z]{2,10}\)[!^046]*[^046]
    

    在Find 对话框中使用时会找到一个句子(以句点^046 为界)。

    请注意,此正则表达式返回一个两端带有句号的字符串,例如,

    。使用了三个字母的首字母缩写词 (TLA)。

    另请注意,我将首字母缩写词长度限制为 10 个字符 [A-Z]{2,10};根据需要更改上限。

    最后我观察到这不会在句尾找到首字母缩略词,例如

    我使用了三个字母的首字母缩写词 (TLA)。

    正则表达式的[!^046]* 部分似乎与零长度字符串不匹配。要捕获这些情况,您需要使用以下方法进行第二遍搜索:

    [^046][!^046]*\([A-Z]{2,10}\)[^046]
    

    希望有帮助

    【讨论】:

    • 这个正则表达式给出了一个编译错误“预期:语句结束”。我是否缺少某种库或设置?我在 Word 中使用 Microsoft 的 VB 编辑器。
    • 当我使用 .Text = "[^046][!^046]*\([A-Z]{2,10}\)[!^046]*[^046]" 时,我没有收到编译错误,Find 捕获带有首字母缩略词的句子。
    • 那是因为我是个白痴,忘记了引号!稍后会尝试。
    • 此解决方案的其他限制: (1) 由于它在前一句中查找句点,因此正则表达式不会在句子#1 中找到匹配项。 (2) 句首首字母缩略词是一种特殊情况(见句尾首字母缩略词注释)。 (3) 没有在包含多个首字母缩写词的句子上测试正则表达式。
    • 谢谢。这就是我一直在寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多