【Access小品】无关紧要--提取字符串中的数字示例-煮江品茶
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> 源码示例


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

发表时间:2013/3/15 16:40:30 评论(3) 浏览(14298)  评论 | 加入收藏 | 复制
   
摘 要:【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群(群号:198465573)
 
 相关文章
如何提取字符串里的数字?  【UMVSOFT整理  2008/5/28】
【Accesss示例】提取字符串中的数字  【钱玉炜  2009/3/31】
系列数字提取函数  【羽扇子君  2011/3/4】
【Access源码示例】提取字符串中的字母\把数据中的字母筛选出来  【红尘如烟  2012/2/20】
【杂草中找到药材】提取文本中的电话号码  【纵云梯  2012/5/15】
【Access自定义函数】不规则提取日期数据的示例  【红尘如烟  2013/2/13】
常见问答
技术分类
相关资源
文章搜索
关于作者

煮江品茶

文章分类

文章存档

友情链接