Regex VBA正则表达式以匹配时间范围,如;下午1:30至凌晨12:00“;
我正在尝试使用VBA正则表达式来验证以下形式的时间范围:Regex VBA正则表达式以匹配时间范围,如;下午1:30至凌晨12:00“;,regex,vba,excel,Regex,Vba,Excel,我正在尝试使用VBA正则表达式来验证以下形式的时间范围:#0:00xm-#0:00xm,其中x是a或p。因此字符串文本可以是“1:30pm-12:00am”。我想匹配具有此模式的单元格 当我在此在线工具中使用常规express时:http://public.kvalley.com/regex/regex.asp并检查我的表达式,它匹配正确 但是,当我在VBA中使用相同的表达式时,它不匹配 Dim rRange As Range Dim rCell As Range Set rRange = R
#0:00xm-#0:00xm
,其中x
是a
或p
。因此字符串文本可以是“1:30pm-12:00am”
。我想匹配具有此模式的单元格
当我在此在线工具中使用常规express时:http://public.kvalley.com/regex/regex.asp
并检查我的表达式,它匹配正确
但是,当我在VBA中使用相同的表达式时,它不匹配
Dim rRange As Range
Dim rCell As Range
Set rRange = Range("A2", "A4") '"G225")
For Each rCell In rRange.Cells
MsgBox (rCell.Value)
If rCell.Value Like "^([0-9]{1,2}[:][0-9]{2}[apm]{2}[ ][-][ ][0-9]{1,2}[:][0-9]{2}[apm]{2})$" Then
MsgBox ("YES")
'rCell.Interior.Color = RGB(0, 250, 0)
Else
MsgBox ("NO")
'rCell.Interior.Color = RGB(250, 0, 0)
End If
Next rCell
在Excel内部,转到“单元格格式>编号>类别>自定义”。您将看到大量的时间类型格式 您可能正在寻找的是h:mm AM/PM 好的。我确实对此进行了更多的研究,并意识到我的短视 这是你想要的吗?我用AM/PM和未按这种方式格式化的单元格对时间值进行了基本测试
Dim rRange As Range
Dim rCell As Range
Set rRange = Range("A2", "A4")
For Each rCell In rRange
If InStr(1, UCase(rCell.Value), " AM") > 0 Or InStr(1, UCase(rCell.Value), " PM") > 0 Then
If InStr(1, rCell.Value, ":") <> 0 Then Debug.Print rCell.Value
End If
Next
Dim排列为范围
变暗rCell As范围
设置排列=范围(“A2”、“A4”)
对于安排中的每个rCell
如果InStr(1,UCase(rCell.Value),“AM”)>0或InStr(1,UCase(rCell.Value),“PM”)>0,则
如果InStr(1,rCell.Value,“:”)为0,则调试.打印rCell.Value
如果结束
下一个
让我们清理并改进您的正则表达式:
^\d\d?:\d\d[aApP][mM] - \d\d?:\d\d[aApP][mM]$
仅当整个单元格的格式与您所需的日期相同时,此选项才匹配,其他条件(条件^\uuuuuuu$conditions)。
我添加了a和a,以及p和p,以确保没有案例问题
我在这台机器上没有VBA/Excel,因此无法使用我的正则表达式尝试您的代码,但正则表达式本身可以工作。对于任何关心的人,这是我的固定工作版本,特别感谢dda使用更简单的正则表达式^ ^:
Dim rRange As Range
Dim rCell As Range
Dim re As Object
Set re = CreateObject("vbscript.regexp")
With re
.Pattern = "^\d\d?:\d\d[aApP][mM] - \d\d?:\d\d[aApP][mM]$"
.Global = False
.IgnoreCase = False
End With
Set rRange = Range("A2", "G225")
For Each rCell In rRange.Cells
If re.Test(rCell) Then
rCell.Interior.Color = RGB(0, 250, 0)
Else
rCell.Interior.Color = RGB(250, 0, 0)
End If
Next rCell
我不认为正则表达式可以匹配一个格式化的数字,因为它是一个字符串-你试过了吗?谢谢你指出我的短视。我相信我已经编辑了一个更实用的VBA方法的答案。请检查LIKE运算符是否区分大小写/[apm]{2}/可以写成/[ap]m/,这样可以更清楚地知道可接受的字符串是什么。现在您将
/
放在前面。你认为这可能是问题所在吗?如果是这样,我该如何正确使用/
?@Matt不使用/
-将斜杠视为/regex literal/
(该语法实际上在perl、javascript和其他语言中使用)+1作为deathApril的解释。如果VBA的LIKE与visualbasic的LIKE()相同,则此运算符根本不接受正则表达式。所以Scott的InStr()解决方案可能是可行的。@Matt-要在VBA中使用正则表达式,see-LIKE运算符不支持正则表达式模式,但通配符模式()@Scott-LIKE运算符不支持正则表达式,而不是VBAah。。。那么,像这样的东西被认为是正则表达式-($*#,##0#)_($*(#,##,##0);(($*“-”);((@)-)。作为一个自学成才的VBA探索其他编程领域,我仍然在学习VBA之外的编程!编辑:->无需担心,我看到上面的链接,在这种情况下使用r.match:Dim r As Regex=new Regex(pattern,RegexOptions.IgnoreCase);Dim As match=r.match(text)@Scott如果您有与此答案无关的问题,请随时提问。@dda请编辑您的答案,不要将答案中最重要的信息放在评论中