Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex VBA正则表达式以匹配时间范围,如;下午1:30至凌晨12:00“;_Regex_Vba_Excel - Fatal编程技术网

Regex VBA正则表达式以匹配时间范围,如;下午1:30至凌晨12:00“;

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

我正在尝试使用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 = 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请编辑您的答案,不要将答案中最重要的信息放在评论中