|
本帖最后由 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
|