设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2274|回复: 6
打印 上一主题 下一主题

[其它] [原创][分享][下载]在Access中怎样使用正则表达式验证数据?

[复制链接]
跳转到指定楼层
1#
发表于 2007-4-1 03:54:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



在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编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2007-4-1 04:02:00 | 只看该作者
正则表达式还有不少用法,需要大家进一步研究了。比如:替换
3#
 楼主| 发表于 2007-4-1 04:13:00 | 只看该作者
VBS中的RegExp,提供的方法并不多,所以用途上也受到限制。如果要更深入地使用正则表达式,那么就需要使用到.NET了,在.NET的System.Text的命名空间中有个RegularExpressions类,我们可以使用。

要使用.NET中的东东,并不是那么容易,因为access只支持COM组件,这就需要在VS中创建Access能访问的COM组件,将一些属性和方法暴露出来,供VBA使用。关于这个问题,我们在以后的帖子中进行探讨。

如果使用上述方法,Access的功能将大大加强,这样一来就可以通过中间代理访问Web服务,比如发送短信等。这听起来很让人心动。当然这些都是建立在.NET架构上的,所以要在电脑中安装了.NET架构才可以。

[此贴子已经被作者于2007-3-31 20:13:52编辑过]

4#
发表于 2007-4-1 18:25:00 | 只看该作者

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
5#
 楼主| 发表于 2007-4-2 00:23:00 | 只看该作者
几种常正则表达式,供参考。
"^\\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
6#
发表于 2009-7-23 23:13:30 | 只看该作者
这是个好东东,就是不太好学,不好写,挺有意思的.
7#
发表于 2009-7-23 23:16:07 | 只看该作者
太有用了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-6-7 07:41 , Processed in 0.096967 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表