在Access中,怎样保证数据的准确性?一般会想到采用合适的字段类型,设置合适的字段大小,设置掩码和有效性规则。这在很大程度上可以减少错误数据的输入,但是我们很多时候都不会采用这样的方法,尤其在VBA中这些方法就显得不太有用了,这时候也许会用VBA代码来进行验证数据,这虽然是个不错的方法,但对于复杂的数据验证代码就会变得很长,而且很容易出现错误。比如:验证IP地址,检查文件路径是否正确。
我们下面用验证Email地址来作个说明。下面是采用常规的方法来验证Email地址是否有效的一个函数,代码比较长,如果有效返回True。代码如下:
Public Function IsValidEmail(email As String) As Boolean
Dim names, name, i As Integer, c As String
IsValidEmail = True
names = Split(email, "@")
If UBound(names) <> 1 Then
IsValidEmail = False
Exit Function
End If
For Each name In names
If Len(name) <= 0 Then
IsValidEmail = False
Exit Function
End If
For i = 1 To Len(name)
c = LCase(Mid(name, i, 1))
If InStr("abcdefghijklmnopqrstuvwxyz_-.", c) <= 0 And Not IsNumeric(c) Then
IsValidEmail = False
Exit Function
End If
Next
If Left(name, 1) = "." Or Right(name, 1) = "." Then
IsValidEmail = False
Exit Function
End If
Next
If InStr(names(1), ".") <= 0 Then
IsValidEmail = False
Exit Function
End If
i = Len(names(1)) - InStrRev(names(1), ".")
If i <> 2 And i <> 3 Then
IsValidEmail = False
Exit Function
End If
If InStr(email, "..") > 0 Then
IsValidEmail = False
End If
End Function
看上去确实让人有点眼花,是否有更简洁的方法来实现呢?这个回答是肯定的。首先我得向大家介绍个概念:正则表达式。也许你听说过,也许你没有,但这并不妨碍我们。在VBS提供了这样一个类RegExp,这应该是他的缩写,全称是:RegularExpressions。这个类非常有用,功能强大。
首先在VBE界面中添加引用Microsoft VBScript Regular Expressions,DLL文件一般位于C:\WINDOWS\system32\vbscript.dll。如果没有就自己想想办法了。接下来就可以使用正则表达式了。
声明方法:
Dim re As New RegExp
或者
Dim re As RegExp
Set re = New RegExp
这样就可以使用RegExp提供的属性和方法了。对于它的属性和方法,我们可以在百度上找到许多,这里不加赘述。我只想通过本篇文章起到抛砖引玉的作用。
下面的代码是使用正则表达式来实现验证Email地址是否有效:
Function IsEmailFormat(ByVal email As String) As Boolean
Dim re As New RegExp
Dim pattern As String
pattern = "^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
re.IgnoreCase = True
re.Global = True
re.pattern = pattern
IsEmailFormat = re.Test(email)
Set re = Nothing
End Function
看上去是否简单多了呢?代码的关键就是这些看不太明白的字符:"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"。
我们还可以定义个通用的验证函数:
Public Function IsMatch(ByVal sourceString As String, ByVal pattern As String) As Boolean
Dim re As New RegExp
re.IgnoreCase = True
re.Global = True
re.pattern = pattern
IsMatch = re.Test(sourceString)
Set re = Nothing
End Function
sourceString:需要验证的字符串
pattern:正则表达式
返回值:通过验证返回True,否则False。
针对不同的验证,我不需要重新去写个函数,要做的仅仅是选择不同的表达式,这些表达式可以在网上找到许多。
列举几个常用表达式:
1. 检查24小时格式的时间:^([0-1][0-9]|[2][0-3])[0-5][0-9])$
2. 检查文件的路径和扩展名:^([a-zA-Z]\:|\\)\\([^\\])*[^\/::*?”<>|]+\.doc(1)?$ (可以把doc改为有效的文件扩展名)
3. 检查Web站点地址的有效性:^([url=http://([\w-]+\]http://([\w-]+\[/url].)+[\w-]+(/[\w-./%&=)*)?)$
[此贴子已经被作者于2007-3-31 19:56:02编辑过]
|