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
')

Read 351 times
(6 in last 30 days)

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating