Technical Article

RegExp find

,

This function will return a table with all matches from a RegExp find.
Also the first 9 SubMatches are returned.

A example execution is included.

-- =============================================
-- Create table function (TF)
-- =============================================
IF EXISTS (SELECT * 
   FROM   sysobjects 
   WHERE  name = N'fnRexExpFind')
DROP FUNCTION fnRexExpFind
GO



CREATE   FUNCTION fnRexExpFind 
(
@PaternVARCHAR(8000), 
@strTEXT
)
RETURNS @Result TABLE 
(
NRNUMERIC,
MatchVARCHAR ( 4096 ),
MIndexNUMERIC,
MLenNUMERIC,
SubMatch1VARCHAR ( 256 ),
SubMatch2VARCHAR ( 256 ),
SubMatch3VARCHAR ( 256 ),
SubMatch4VARCHAR ( 256 ),
SubMatch5VARCHAR ( 256 ),
SubMatch6VARCHAR ( 256 ),
SubMatch7VARCHAR ( 256 ),
SubMatch8VARCHAR ( 256 ),
SubMatch9VARCHAR ( 256 )
)
AS
BEGIN


DECLARE @hr    INT  

DECLARE @regExpINT
DECLARE@descVARCHAR( 8000 )
DECLARE @matchesINT
DECLARE @matchINT
DECLARE @submatchesINT
DECLARE @submatchINT


DECLARE@bMatchBIT

DECLARE@DoingVARCHAR( 256 )


DECLARE@tmpCharVARCHAR( 8000 )
DECLARE@tmpNumINT
DECLARE@tmpNum2INT

DECLARE@iNumNUMERIC
DECLARE@CountINT

DECLARE@iNum2NUMERIC
DECLARE@Count2INT



SET@Doing= 'Create RegExp object.'
EXEC@hr= master.dbo.sp_OACreate 'VBScript.RegExp', @regExp OUTPUT  
IF @hr <> 0
GOTO Error

SET@Doing= 'Set pattern.'
EXEC@hr= sp_OASetProperty @regExp, 'Pattern', @Patern
IF @hr <> 0
GOTO Error

SET@Doing= 'Set Global property.'
EXEC@hr= sp_OASetProperty @regExp, 'Global', 'true'
IF @hr <> 0
GOTO Error

SET@Doing= 'Set IgnoreCase property.'
EXEC@hr= sp_OASetProperty @regExp, 'IgnoreCase', 'true'
IF @hr <> 0
GOTO Error

SET@Doing= 'Set Multiline property.'
EXEC@hr= sp_OASetProperty @regExp, 'Multiline', 'true'
IF @hr <> 0
GOTO Error

SET@Doing= 'Executing "test" method.'
EXEC@hr= sp_OAMethod @regExp, 'Test', @bMatch OUTPUT, @str
IF @hr <> 0
GOTO Error

IF @bMatch = 1
BEGIN
SET@Doing= 'Executing "Execute" method.'
EXEC@hr= sp_OAMethod @regExp, 'Execute', @matches OUTPUT, @str
IF @hr <> 0
GOTO Error


SET@Doing= 'Executing "Count" method.'
EXEC@hr= sp_OAMethod @matches, 'Count', @Count OUTPUT
IF @hr <> 0
GOTO Error
SET @iNum= 0
WHILE @iNum < @Count
BEGIN
INSERT INTO @Result(NR)
VALUES(@iNum)

SET@Doing= 'Creating match object.'
SET@tmpCHAR= 'Item(' + CAST(@iNum AS VARCHAR) + ')'
EXEC@hr= sp_OAMethod @matches, @tmpCHAR, @match OUTPUT
IF @hr <> 0
GOTO Error


SET@Doing= 'Get "Value" property.'
EXEC@hr= sp_OAGetProperty @match, 'Value', @tmpCHAR OUTPUT
IF @hr <> 0
GOTO Error

UPDATE@Result
SETMatch= @tmpCHAR
WHERENR= @iNum


SET@Doing= 'Get "FirstIndex" property.'
EXEC@hr= sp_OAGetProperty @match, 'FirstIndex', @tmpNum OUTPUT
IF @hr <> 0
GOTO Error

UPDATE@Result
SETMIndex= @tmpNum
WHERENR= @iNum

SET@Doing= 'Get "Length" property.'
EXEC@hr= sp_OAGetProperty @match, 'Length', @tmpNum2 OUTPUT
IF @hr <> 0
GOTO Error
UPDATE@Result
SETMLen= @tmpNum2
WHERENR= @iNum

SET@Doing= 'Creating submatches object.'
EXEC@hr= sp_OAMethod @match, 'SubMatches', @submatches OUTPUT
IF @hr <> 0
GOTO Error


EXEC@hr= sp_OAMethod @submatches, 'Count' , @Count2 OUTPUT
IF @hr <> 0
GOTO Error

SET @iNum2= 0
WHILE @iNum2 < @Count2
BEGIN
SET@Doing= 'Creating submatch object.'
SET@tmpCHAR= 'Item(' + CAST(@iNum2 AS VARCHAR) + ')'
EXEC@hr= sp_OAMethod @submatches, @tmpCHAR , @tmpCHAR OUTPUT
IF @hr <> 0
GOTO Error

UPDATE@Result
SETSubMatch1= CASE @iNum2 WHEN 0 THEN @tmpCHAR ELSE SubMatch1 END,
SubMatch2= CASE @iNum2 WHEN 1 THEN @tmpCHAR ELSE SubMatch2 END,
SubMatch3= CASE @iNum2 WHEN 2 THEN @tmpCHAR ELSE SubMatch3 END,
SubMatch4= CASE @iNum2 WHEN 3 THEN @tmpCHAR ELSE SubMatch4 END,
SubMatch5= CASE @iNum2 WHEN 4 THEN @tmpCHAR ELSE SubMatch5 END,
SubMatch6= CASE @iNum2 WHEN 5 THEN @tmpCHAR ELSE SubMatch6 END,
SubMatch7= CASE @iNum2 WHEN 6 THEN @tmpCHAR ELSE SubMatch7 END,
SubMatch8= CASE @iNum2 WHEN 7 THEN @tmpCHAR ELSE SubMatch8 END,
SubMatch9= CASE @iNum2 WHEN 8 THEN @tmpCHAR ELSE SubMatch9 END
WHERENR= @iNum

SET @iNum2= @iNum2 + 1
END

SET@Doing= 'Destroy Match object.'
EXEC@hr= master.dbo.sp_OADestroy @match
IF @hr <> 0
GOTO Error

SET @iNum= @iNum + 1
END

SET@Doing= 'Destroy Matches object.'
EXEC@hr= master.dbo.sp_OADestroy @matches  
END

-- IF we get here the normal way, don't do error
GOTO Cleanup
Error:
EXEC sp_OAGetErrorInfo @regExp, @tmpChar OUT, @desc OUT 

INSERT INTO @Result ( NR ,Match )
SELECT0, 
'Error ['+ ISNULL( CAST( convert(varbinary(4),@hr) AS VARCHAR ), '' ) +
'], While ['+ ISNULL( @Doing, '' ) + 
'], Source ['+ ISNULL( @tmpChar, '' ) + 
'], Description ['+ ISNULL( @desc, '' ) + ']'

GOTO Result

Cleanup:
EXEC@hr= master.dbo.sp_OADestroy @regExp  
IF @hr <> 0
GOTO Error

Result: 

RETURN 
END
GO
-- =============================================
-- Example to execute function
-- =============================================
SELECT * FROM dbo.fnRexExpFind
( '(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((?:19|20)\d\d.)', '
Date1: 01/01/2005
Date2: 31-01-2001
Date3: 11.12.2005
')

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating