Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 源码示例

【Access小品】无关紧要--提取字符串中的数字示例

时 间:2013-03-15 16:40:30
作 者:煮江品茶   ID:10802  城市:武汉
摘 要:【Access小品】无关紧要--提取字符串中的数字示例
正 文:

      版友yanwei82123300同志问如何在下面的字段中提取G和SR后面的数字:

MODULE,PWR G01 14-00
MODULE,PWR G01 14-00
MODULE,PWR G01 14-00
MODULE,PWR G01 14-00
MODULE,PWR G4 16-11
ASSY,PWR G2 12-11*W/JSCR*
MODULE,SPRING G7-SR3-00
MODULE,SPRING G7-SR4-00
MODULE,SPRING G7-SR4-00*NDT*
MODULE,SPRING G8-SR1-11
MODULE,SPRING G7-SR3-10
MODULE,SPRING G01-SR1-00*NDT*
MODULE,SPRING G7-SR3-00
MODULE,SPRING G7-SR2-00


    这样一个字段中分别取出G和SR中的数据并不是非常容易的事情,你可能说可以用Split通过空格符号和减号分解后可以处理,也可以用遍历字符找到位置后截取字符来处理,这些方法或许都可以处理这个问题,但是会很费时费力。什么办法可以事半功倍呢?答案是用正则表达式来处理。


    什么是正在表达式呢?这样写出来的就是正则表达式:“^.*G\d+.*$”


    你会说这看起来是乱码。对了,正则表达式看起来是很像一堆乱码。不过你要懂了,就知道这个正则表达式是有明确含义的。它表示的是这样一类(注意是一类)字符串:开始有很多我们不关心的字符(也可能没有),中间是一个G,并紧跟随着几个数字,结尾也有很多我们不关心的字符(也可能没有)。这样一说,你可能明白我想干什么了,我将一个字段中的所有记录,用正在表达式的语言表示出来了。


    如果仅仅判断一类字符串中是否存在G后面带有数字的子字符串,其正则表达式不需要如此复杂,我们可以这样来写:“G\d+”。这个正则表达式可以匹配所有存在G后面紧跟数字的字符串。这个正则表达式非常简单,其中\d表示一个0到9的字符,后面的加号表示这个至少存在一个数字字符。实际上\d+就表示了所有由数字组成的字符串。


    回到第一个正则表达式,这个表达式中存在两个“.*”子串。在正则表达式中“.”表示任意字符,如果是任意多个字符,我们就用“.*”表示。“*”和“+”的作用相同,都表示重复,不过“*”表示重复0到若干次,而“+”表示重复1到若干次。    “.”和“\d”都是正则表达式中的通配符。诸如此类的通配符很多,比如“\w”匹配字母或数字或下划线,“\W”匹配除字母或数字或下划线以外的字符,“\D”匹配除数字以外的字符等等。“^”和“$”也是一种通配符,不过他们是位子通配符,分别表示字符串的开始和结束。


    说的有些远了,要学习正则表达式的话你还是找些完整的资料看看,我们还是来说问题的解决方法。首先我们需要写两个自定义函数,第一个函数用来判断某种正则表达式是否能匹配成功,第二个对匹配成功的字符串做正则替换。


Function TestStr(ByVal Test_str As String, ByVal match_str As String) As Boolean
    '引用:Microsoft VBScript Regular Expressions 5.5
    '功能:是否匹配正则表达式
    '参数:Test_str--测试字符串,match_str--正则表达式
    Dim re As New regexp
    re.Pattern = match_str
    re.IgnoreCase = True
    re.Global = True
    TestStr = re.Test(Test_str)
    Set re = Nothing
End Function


Function ReplaceMatch(ByVal str As String, ByVal match_str As String, ByVal Rematch_str As String) As String
    '引用:Microsoft VBScript Regular Expressions 5.5
    '功能:替换字符串
    '参数:Test_str--测试字符串,match_str--源正则表达式,Rematch_str--替换的正则表达式
    Dim re As New regexp
    re.Pattern = match_str
    re.IgnoreCase = True
    re.Global = True
    ReplaceMatch = re.Replace(str, Rematch_str)
    Set re = Nothing
End Function


   有了这两个函数,我们就可以在查询中引用函数来找到G后面的数字,我们可以这样写查询:


   Select itemdetail.ITEM, itemdetail.desc, IIf(teststr([desc],"G\d+"),ReplaceMatch([desc],"(^.*G)(\d+)(.*$)","$2"),"") AS G后的数字
FROM itemdetail;


   你可能注意到在查询中,替换部分的正则表达式是这样写的:"(^.*G)(\d+)(.*$)"。对!用三对括号将正在表达式分成了三段,为什么要这样呢?这是因为加了括号后,我们就可以捕获到正则表达式变量了。也就是说:(^.*G)为第一个变量其默认的变量名为$1,(\d+)为第二个变量其默认的变量名为$2,(.*$)为第三个变量其默认的变量名为$3。这样一说,你应该就明白了,与这个正则表达式匹配的字符串,我们用$2变量替换了,也就是G后面的数字替换整个字符串了。这么一折腾,便也就提取出来G后的数字了。


  实际上正则表达式在编写程序时不常用上,所以可以稍微接触一二,不学也无关紧要。

附   件:

点击下载此示例


演   示:



Access软件网官方交流QQ群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助