【问题标题】:Call regex in an Excel cell在 Excel 单元格中调用正则表达式
【发布时间】:2013-08-07 05:27:59
【问题描述】:

我想使用正则表达式匹配从单元格中提取字符串。 我找不到执行此操作的 excel 函数,而且我也不是 VBA 专家。 我使用 Excel 2007。

【问题讨论】:

    标签: regex excel excel-2007 vba


    【解决方案1】:

    在 Excel VBA 代码编辑器中选择工具/参考。在选择器中检查最新版本的 Microsoft VBScript 正则表达式。

    这是一个简单的用户定义函数,可帮助您入门。如果您将其指向包含“foobar”或“fooooobar”的单元格,这将返回“foo”。

    Function RegExtract(contents As String)
        Dim regx As RegExp
        Set regx = New RegExp
    
        With regx
        .Pattern = "f[o]+"
            With .Execute(contents)
                If .Count Then RegExtract = .Item(0).Value
            End With
        End With
    End Function
    

    【讨论】:

    • grrr 所以我需要写一些 VBA ......我希望我可以避免这种情况。
    • 工具/参考是灰色的...嗯。任何想法。
    • 发现我的安全设置在阻止。有一个小错误 MyExtract -> RegExtract
    【解决方案2】:

    这里有一个函数可以让你传入一个单元格,然后传入任何正则表达式模式。在您希望函数返回的模式部分周围使用 ()。

    Function RegexExtract(ByVal text As String, _
                          ByVal extract_what As String) As String
    
    Dim allMatches As Object
    Dim RE As Object
    Set RE = CreateObject("vbscript.regexp")
    
    RE.Pattern = extract_what
    RE.Global = True
    Set allMatches = RE.Execute(text)
    RegexExtract = allMatches.Item(0).submatches.Item(0)
    
    End Function
    

    【讨论】:

      【解决方案3】:

      Excel 的 VBA 系统中有一个称为 Microsoft VBScript 正则表达式的库。从内部 VBA 'IDE' 中包含库后,您可以创建一个简单的宏,该宏接受您想要解析的任何值并将结果返回给调用者(可以是来自单元格的函数调用)。

      【讨论】:

      • 帮助我你如何找到这个库以及你如何称呼 VBA IDE。我是 VB for Excel 的真正新手。
      【解决方案4】:

      @AndrewCowenhoven 有一个很好的答案。添加正则表达式库很简单。只是为了稍微扩展这个答案,我将添加我学到的在匹配项中获取项目的知识。

      例如,我在一个单元格中有这样的字符串。

      doubleclick.net/activityi;u=5f2256de37ab4992927b3a0a0a34f983;u13=;u14=27.34;u16=澳元;u9=;u10=;u11=;u12=;u5=;u6=;u7=;u8=;u1=汽车;u2=SEA;u3=SEA;u4=20130923%20%7C%2020130926;ord=5360319407191.128?

      我只需要几个部分来验证发送给 google 的双击标签是否正确。使用上面显示的正则表达式我有这样的东西。

      Function CheckU3(contents As String)
      Dim regx As RegExp
      Set regx = New RegExp
      Dim matches, s
      
      With regx
      .Pattern = "u3=(.*?);"
      .Global = False
      
      If regx.Test(contents) Then
          Set matches = regx.Execute(contents)
              For Each Var In matches.Item(0).SubMatches
                  s = Var
              Next
      End If
      
      CheckU3 = s
      
      End With
      End Function
      

      我知道这可以简化很多,但关键是我正在使用 parans 拉取子匹配来获得我需要的具体内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多