Office中国论坛/Access中国论坛
标题: [原创][分享][下载]在Access中怎样使用正则表达式验证数据? [打印本页]
作者: fan0217 时间: 2007-4-1 03:54
标题: [原创][分享][下载]在Access中怎样使用正则表达式验证数据?
在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-./%&=)*)?)$
[attach]23803[/attach]
[此贴子已经被作者于2007-3-31 19:56:02编辑过]
作者: fan0217 时间: 2007-4-1 04:02
正则表达式还有不少用法,需要大家进一步研究了。比如:替换
作者: fan0217 时间: 2007-4-1 04:13
VBS中的RegExp,提供的方法并不多,所以用途上也受到限制。如果要更深入地使用正则表达式,那么就需要使用到.NET了,在.NET的System.Text的命名空间中有个RegularExpressions类,我们可以使用。
要使用.NET中的东东,并不是那么容易,因为access只支持COM组件,这就需要在VS中创建Access能访问的COM组件,将一些属性和方法暴露出来,供VBA使用。关于这个问题,我们在以后的帖子中进行探讨。
如果使用上述方法,Access的功能将大大加强,这样一来就可以通过中间代理访问Web服务,比如发送短信等。这听起来很让人心动。当然这些都是建立在.NET架构上的,所以要在电脑中安装了.NET架构才可以。
[此贴子已经被作者于2007-3-31 20:13:52编辑过]
作者: 一点通 时间: 2007-4-1 18:25
[attach]23806[/attach]
作者: fan0217 时间: 2007-4-2 00:23
几种常正则表达式,供参考。
"^\\d+$" //非负整数(正整数 + 0)
"^[0-9]*[1-9][0-9]*$" //正整数
"^((-\\d+)|(0+))$" //非正整数(负整数 + 0)
"^-[0-9]*[1-9][0-9]*$" //负整数
"^-?\\d+$" //整数
"^\\d+(\\.\\d+)?$" //非负浮点数(正浮点数 + 0)
"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数
"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$" //非正浮点数(负浮点数 + 0)
"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数
"^(-?\\d+)(\\.\\d+)?$" //浮点数
"^[A-Za-z]+$" //由26个英文字母组成的字符串
"^[A-Z]+$" //由26个英文字母的大写组成的字符串
"^[a-z]+$" //由26个英文字母的小写组成的字符串
"^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串
"^\\w+$" //由数字、26个英文字母或者下划线组成的字符串
"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$" //email地址
"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$" //url
作者: 鱼求雨 时间: 2009-7-23 23:13
这是个好东东,就是不太好学,不好写,挺有意思的.
作者: ndbs 时间: 2009-7-23 23:16
太有用了,谢谢
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |