Regex VBA函数正则表达式

Regex VBA函数正则表达式,regex,vba,function,Regex,Vba,Function,你知道这段代码有什么错误吗?如果可用,应提取所有盖和图案“1WO”。 例如,在“用户:399595:账户:ETH:余额”中,我应该有“UAETH”,在“用户:197755:账户:1WO:余额”中,我应该有“UA1WO” 多谢各位 Option Explicit Function ExtractCap(Txt As String) As String Application.Volatile Dim xRegEx As Object Set xRegEx = Creat

你知道这段代码有什么错误吗?如果可用,应提取所有盖和图案“1WO”。 例如,在“用户:399595:账户:ETH:余额”中,我应该有“UAETH”,在“用户:197755:账户:1WO:余额”中,我应该有“UA1WO”

多谢各位

Option Explicit

Function ExtractCap(Txt As String) As String

    Application.Volatile
    Dim xRegEx As Object
    Set xRegEx = CreateObject("VBSCRIPT.REGEXP")

    If xRegEx.Pattern = "[^A-Z]" Then
    xRegEx.Global = True
    xRegEx.MultiLine = False
    ExtractCap = xRegEx.Replace(Txt, "")
    Set xRegEx = Nothing

    Else: xRegEx.Pattern = "1WO"
    ExtractCap = xRegEx.Execute(Txt)

    End If

End Function
我不是“正则表达式”专家,因此您可能想尝试另一种选择:

Function ExtractCap(Txt As String) As String
    Application.Volatile
    Dim i As Long

    For i = 1 To Len(Txt)
        Select Case Asc(Mid(Txt, i, 1))
            Case 65 To 90
               ExtractCap = ExtractCap & Mid(Txt, i, 1)
        End Select
    Next
End Function
尽管如此,如果您的数据模式严格如您所示,您还可以考虑:

Function ExtractCap(Txt As String) As String
    Application.Volatile
    ExtractCap = "UA" & Split(Txt, ":")(3)
End Function

您的正则表达式的工作原理如下:

Function ExtractCap(Txt As String) As String

    Application.Volatile
    Dim xRegEx As Object
    Set xRegEx = CreateObject("VBScript.RegExp")

    With xRegEx
        .Pattern = "[^A-Z]"
        .Global = True
        .MultiLine = False
        ExtractCap = .Replace(Txt, vbNullString)
    End With

    If Txt = ExtractCap Then ExtractCap = "1WO"

End Function

Public Sub TestMe()
    Debug.Print ExtractCap("User:399595:Account:ETH:balance")
End Sub
在您的代码中,有2个错误停止了执行:

  • 将xRegEx设置为
    ,然后要求它提供一个值
  • 如果xRegEx.Pattern=“[^A-Z]”检查
    ,实际上对
    VBA
    没有多大意义。例如,您正在设置一个
    模式
    ,并对其设置一个条件。如果您想知道正则表达式中是否存在一个模式,那么应该比较这两个字符串——在执行模式之前和之后

    • 您的问题很容易解决

      首先,我假设
      1WO
      最多可以在字符串中出现一次

      基于这一假设,逻辑如下:

      定义函数,该函数从字符串中提取所有大写字母

      现在,在main函数中,首先使用
      1WO
      作为delimeter拆分字符串。现在,将每个字符串(拆分后)传递给函数,从这些字符串中获取所有的大写字母,并用
      1WO
      重新连接它们

      Option Explicit
      
      Public Function Extract(str As String) As String
      Dim s As Variant
      For Each s In Split(str, "1WO")
          'append extracted caps with 1WO at the end
          Extract = Extract & ExtractCaps(s) & "1WO"
      Next
      'delete lest 1WO from result
      Extract = Left(Extract, Len(Extract) - 3)
      
      End Function
      
      Function ExtractCaps(str As Variant) As String
      Dim i As Long, char As String
      For i = 1 To Len(str)
          char = Mid(str, i, 1)
          If Asc(char) > 64 And Asc(char) < 91 And char = UCase(char) Then
              ExtractCaps = ExtractCaps & char
          End If
      Next
      End Function
      
      选项显式
      公共函数提取(str作为字符串)作为字符串
      作为变体的Dim s
      对于拆分中的每个s(str,“1WO”)
      '在末尾附加提取的CAP和1WO
      提取=提取和提取瓶盖和“1WO”
      下一个
      '从结果中删除WO
      摘录=左侧(摘录,镜头(摘录)-3)
      端函数
      函数ExtractCaps(str作为变量)作为字符串
      Dim i为长,char为字符串
      对于i=1到Len(str)
      char=Mid(str,i,1)
      如果Asc(char)>64且Asc(char)<91且char=UCase(char),则
      ExtractCaps=ExtractCaps和char
      如果结束
      下一个
      端函数
      

      如果将此代码放入插入的
      模块
      ,则可以在公式中的工作表中使用它:
      =Extract(A1)

      如果xRegEx.Pattern=“[^a-Z]”,为什么要使用
      ?只需设置模式,如果
      ,则无需使用
      。WO也大写