SQL Server 正则表达式(VBScript.RegExp)

2012-04-06  金城  3820

存储过程

CREATE FUNCTION dbo.find_regular_expression(

@source varchar(5000),--需要匹配的源字符串
@regexp varchar(1000),--正则表达式
@ignorecase bit = 0--是否区分大小写,默认为false

)
RETURNS bit --返回结果0-false,1-true
AS
BEGIN

--0(成功)或非零数字(失败),是由 OLE 自动化对象返回的 HRESULT 的整数值。

DECLARE @hr integer

--用于保存返回的对象令牌,以便之后对该对象进行操作

DECLARE @objRegExp integer DECLARE @objMatches integer

--保存结果

DECLARE @results bit

EXEC @hr = sp_OACreate 'VBScript.RegExp',@objRegExp OUTPUT
IF @hr <>0 BEGIN
 SET @results = 0
 RETURN @results
END

EXEC @hr = sp_OASetProperty @objRegExp,'Pattern',@regexp
IF @hr <>0 BEGIN
 SET @results = 0
 RETURN @results
END
EXEC @hr = sp_OASetProperty @objRegExp,'Global',false
IF @hr <>0 BEGIN
 SET @results = 0
 RETURN @results
END
EXEC @hr = sp_OASetProperty @objRegExp,'IgnoreCase',@ignorecase
IF @hr <>0 BEGIN
 SET @results = 0
 RETURN @results
END


--调用对象方法

EXEC @hr = sp_OAMethod @objRegExp,'Test',@results OUTPUT,@source
IF @hr <>0 BEGIN
 SET @results = 0
 RETURN @results
END

--释放已创建的 OLE 对象

EXEC @hr = sp_OADestroy @objRegExp
IF @hr <>0 BEGIN
 SET @results = 0
 RETURN @results
END
RETURN @results

END


测试

--下面是一个简单的测试sql语句,可以直接在查询分析器中运行。

DECLARE @intLength AS INTEGER
DECLARE @vchRegularExpression AS VARCHAR(50)
DECLARE @vchSourceString as VARCHAR(50)
DECLARE @vchSourceString2 as VARCHAR(50)
DECLARE @bitHasNoSpecialCharacters as BIT

-- 初始化变量

SET @vchSourceString = 'Test one This is a test!!'
SET @vchSourceString2 = 'Test two This is a test'

-- 我们的正则表达式应该类似于
-- [a-zA-Z ]{}
-- 如: [a-zA-Z ]{10}... 一个十字符的字符串

-- 获得字符串长度

SET @intLength = LEN(@vchSourceString)

-- 设置完整的正则表达式

SET @vchRegularExpression = '[a-zA-Z ]{' + CAST(@intLength as varchar) + '}'

-- 是否有任何特殊字符

SET @bitHasNoSpecialCharacters = dbo.find_regular_expression(@vchSourceString,@vchRegularExpression,0)

PRINT @vchSourceString
IF @bitHasNoSpecialCharacters = 1 BEGIN
 PRINT 'No special characters.'
 END ELSE BEGIN
 PRINT 'Special characters found.'
END

PRINT '**************'

-- 获得字符串长度

SET @intLength = LEN(@vchSourceString2)

-- 设置完整的正则表达式

SET @vchRegularExpression = '[a-zA-Z ]{' + CAST(@intLength as varchar) + '}'

-- 是否有任何特殊字符

SET @bitHasNoSpecialCharacters = dbo.find_regular_expression(@vchSourceString2,@vchRegularExpression,0)

PRINT @vchSourceString2
IF @bitHasNoSpecialCharacters = 1 BEGIN
 PRINT 'No special characters.'
 END ELSE BEGIN
 PRINT 'Special characters found.'
END

GO