设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[模块/函数] 【Access小品】无关紧要--提取字符串中的数字示例

[复制链接]
跳转到指定楼层
1#
发表于 2013-3-15 16:12:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 todaynew 于 2013-3-15 19:09 编辑

     版友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后的数字了。

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







本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖1 订阅订阅
2#
发表于 2013-3-15 16:21:02 | 只看该作者
老大爷真是雷锋,说的如此详细!值得学习!
3#
发表于 2013-3-15 16:50:43 | 只看该作者
todaynew 真牛!!{:soso_e181:}

点击这里给我发消息

4#
发表于 2013-3-15 18:03:49 | 只看该作者
谢谢分享
5#
发表于 2013-3-15 18:23:37 | 只看该作者
本帖最后由 roych 于 2013-3-15 18:32 编辑

大道至简。
正则表达式应该是最有效的,但调试起来似乎没有Mid和Instr方便,所以有时候宁可在查询里多嵌套几个Instr也懒得去写代码。{:soso_e113:}
像这道题目的话,我可能会分三步处理:
1、用Instr和Right把G开始至结束部分先截取出来
2、用Replace把空格替换成短划线。
3、用Instr、Mid根据短划线位置来截取。
当然听起来挺麻烦的,其实并不算太复杂【SQL语句的写法就交给大家,当做家庭作业好了{:soso_e112:}】。
此外,老汉提到的Split函数历遍,同样也需要写代码。
6#
发表于 2015-4-11 00:19:12 | 只看该作者
好好好好好好好好好好好好好好好好好好
7#
发表于 2016-8-20 16:46:52 | 只看该作者
已经阅读,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-10 20:02 , Processed in 0.083936 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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