Regex VBA函数正则表达式
你知道这段代码有什么错误吗?如果可用,应提取所有盖和图案“1WO”。 例如,在“用户:399595:账户:ETH:余额”中,我应该有“UAETH”,在“用户:197755:账户:1WO:余额”中,我应该有“UA1WO” 多谢各位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
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也大写