VBA regexp检查特殊符号

时间:2015-11-20 15:05:14

标签: regex vba testing

我试图使用我在post中学到的东西, 现在我想编写一个RegExp来检查一个字符串是否包含数字和逗号。例如," 1,2,55,2"应该没问题,而" a,2,55,2"或" 1.2,55,2"应该失败测试。我的代码:

Private Function testRegExp(str, pattern) As Boolean
    Dim regEx As New RegExp

    If pattern <> "" Then
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = pattern
        End With

        If regEx.Test(str) Then
            testRegExp = True
        Else
            testRegExp = False
        End If
    Else
        testRegExp = True
    End If
End Function

Public Sub foo()
    MsgBox testRegExp("2.d", "[0-9]+")
End Sub

MsgBox产生true而不是false。问题是什么?

2 个答案:

答案 0 :(得分:1)

您的正则表达式匹配部分字符串,它匹配所有55,2a,2,55,21.2,55,2输入字符串中的数字。

使用主播^$强制执行完整字符串匹配,并在字符类中添加逗号,因为您要匹配仅包含数字和字符串的字符串逗号:

MsgBox testRegExp("2.d", "^[0-9,]*$")
                          ^    ^  ^

我还建议使用*量词来匹配 0或更多次出现,而不是+ 1次或更多次出现),但它是你需要自己决定的事情(是否要允许空字符串匹配)。

这是the regex demo。请注意,它适用于PCRE正则表达式,但此正则表达式在VBA中的表现类似。

是的,正如@Chaz建议的那样,如果您不需要匹配字符串/行本身,则可以选择匹配反向字符类:

MsgBox testRegExp("2.d", "[^0-9,]")

这样,negated character class [^0-9,]将匹配除逗号/数字之外的任何字符,从而使字符串无效。如果结果为True,则表示该字符串包含除数字和逗号之外的一些字符。

答案 1 :(得分:1)

您可以使用有限的内置模式匹配:

function isOk(str) As boolean
    for i = 1 To len(str)
        if Mid$(str, i, 1) Like "[!0-9,]" then exit function
    next
    g = True and Len(str) > 0
end function