我试图使用我在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。问题是什么?
答案 0 :(得分:1)
您的正则表达式匹配部分字符串,它匹配所有55,2
,a,2,55,2
,1.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