【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源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- 统计当月之前(不含当月)的记录...(03.11)
- 【Access Inputbo...(03.03)
- 按回车键后光标移动到下一条记录...(02.12)
- 【Access Dsum示例】...(02.07)
- Access对子窗体的数据进行...(02.05)
- 【Access高效办公】上月累...(01.09)
- 【Access高效办公】上月累...(01.06)
- 【Access Inputbo...(12.23)
- 【Access Dsum示例】...(12.16)

学习心得
最新文章
- 仓库管理实战课程(9)-开发往来单...(04.02)
- 仓库管理实战课程(8)-商品信息功...(04.01)
- 仓库管理实战课程(7)-链接表(03.31)
- 仓库管理实战课程(6)-创建查询(03.29)
- 仓库管理实战课程(5)-字段属性(03.27)
- 设备装配出入库管理系统;基于Acc...(03.24)
- 仓库管理实战课程(4)-建表操作(03.22)
- 仓库管理实战课程(3)-需求设计说...(03.19)
- 仓库管理实战课程(2)-软件背景和...(03.18)
- 仓库管理实战课程(1)-讲师介绍(03.16)