这两天有个需求,需要在数据库中判断字符串的格式,于是从网上搜集了一些资料,整理了一下。
下面这个是一个自定义函数,用户可以调用这个函数判断指定的字符串是否符合正则表达式的规则.
下面是一个简单的测试sql语句,可以直接在查询分析器中运行。
下面这个是一个自定义函数,用户可以调用这个函数判断指定的字符串是否符合正则表达式的规则.
- CREATEFUNCTIONdbo.find_regular_expression
- (
- @sourcevarchar(5000),--需要匹配的源字符串
- @regexpvarchar(1000),--正则表达式
- @ignorecasebit=0--是否区分大小写,默认为false
- )
- RETURNSbit--返回结果0-false,1-true
- AS
- BEGIN
- --0(成功)或非零数字(失败),是由OLE自动化对象返回的HRESULT的整数值。
- DECLARE@hrinteger
- --用于保存返回的对象令牌,以便之后对该对象进行操作
- DECLARE@objRegExpintegerDECLARE@objMatchesinteger
- --保存结果
- DECLARE@resultsbit
- /*
- 创建OLE对象实例,只有sysadmin固定服务器角色的成员才能执行sp_OACreate,并确定机器中有VBScript.RegExp类库
- */
- EXEC@hr=sp_OACreate'VBScript.RegExp',@objRegExpOUTPUT
- IF@hr<>0BEGIN
- SET@results=0
- RETURN@results
- END
- /*
- 以下三个分别是设置新建对象的三个属性。下面是'VBScript.RegExp'中常用的属性举例:
- DimregEx,Match,Matches'建立变量。
- SetregEx=NewRegExp'建立一般表达式。
- regEx.Pattern=patrn'设置模式。
- regEx.IgnoreCase=True'设置是否区分大小写。
- regEx.Global=True'设置全局可用性。
- setMatches=regEx.Execute(string)'重复匹配集合
- RegExpTest=regEx.Execute(strng)'执行搜索。
- foreachmatchinmatches'重复匹配集合
- RetStr=RetStr&"Matchfoundatposition"
- RetStr=RetStr&Match.FirstIndex&".MatchValueis'"
- RetStr=RetStr&Match.Value&"'."&vbCRLFNext
- RegExpTest=RetStr
- */
- EXEC@hr=sp_OASetProperty@objRegExp,'Pattern',@regexp
- IF@hr<>0BEGIN
- SET@results=0
- RETURN@results
- END
- EXEC@hr=sp_OASetProperty@objRegExp,'Global',false
- IF@hr<>0BEGIN
- SET@results=0
- RETURN@results
- END
- EXEC@hr=sp_OASetProperty@objRegExp,'IgnoreCase',@ignorecase
- IF@hr<>0BEGIN
- SET@results=0
- RETURN@results
- END
- --调用对象方法
- EXEC@hr=sp_OAMethod@objRegExp,'Test',@resultsOUTPUT,@source
- IF@hr<>0BEGIN
- SET@results=0
- RETURN@results
- END
- --释放已创建的OLE对象
- EXEC@hr=sp_OADestroy@objRegExp
- IF@hr<>0BEGIN
- SET@results=0
- RETURN@results
- END
- RETURN@results
- END
- DECLARE@intLengthASINTEGER
- DECLARE@vchRegularExpressionASVARCHAR(50)
- DECLARE@vchSourceStringasVARCHAR(50)
- DECLARE@vchSourceString2asVARCHAR(50)
- DECLARE@bitHasNoSpecialCharactersasBIT
- --初始化变量
- SET@vchSourceString='TestoneThisisatest!!'
- SET@vchSourceString2='TesttwoThisisatest'
- --我们的正则表达式应该类似于
- --[a-zA-Z]{}
- --如:[a-zA-Z]{10}...一个十字符的字符串
- --获得字符串长度
- SET@intLength=LEN(@vchSourceString)
- --设置完整的正则表达式
- SET@vchRegularExpression='[a-zA-Z]{'+CAST(@intLengthasvarchar)+'}'
- --是否有任何特殊字符
- SET@bitHasNoSpecialCharacters=dbo.find_regular_expression(@vchSourceString,@vchRegularExpression,0)
- PRINT@vchSourceString
- IF@bitHasNoSpecialCharacters=1BEGIN
- PRINT'Nospecialcharacters.'
- ENDELSEBEGIN
- PRINT'Specialcharactersfound.'
- END
- PRINT'**************'
- --获得字符串长度
- SET@intLength=LEN(@vchSourceString2)
- --设置完整的正则表达式
- SET@vchRegularExpression='[a-zA-Z]{'+CAST(@intLengthasvarchar)+'}'
- --是否有任何特殊字符
- SET@bitHasNoSpecialCharacters=dbo.find_regular_expression(@vchSourceString2,@vchRegularExpression,0)
- PRINT@vchSourceString2
- IF@bitHasNoSpecialCharacters=1BEGIN
- PRINT'Nospecialcharacters.'
- ENDELSEBEGIN
- PRINT'Specialcharactersfound.'
- END
- GO