IF OBJECT_ID(N'dbo.RegexFind') IS NOT NULL
DROP FUNCTION dbo.RegexFind
GO
create function RegexFind(
@pattern VARCHAR(255),
@matchstring VARCHAR(8000),
@global BIT = 1,
@Multiline bit =1)
returns
@result TABLE
(
Match_ID INT,
FirstIndex INT ,
length INT ,
Value VARCHAR(2000),
Submatch_ID INT,
SubmatchValue VARCHAR(2000),
Error Varchar(255)
)
AS -- columns returned by the function
begin
DECLARE @objRegexExp INT,
@objErrorObject INT,
@objMatch INT,
@objSubMatches INT,
@strErrorMessage VARCHAR(255),
@error varchar(255),
@Substituted VARCHAR(8000),
@hr INT,
@matchcount INT,
@SubmatchCount INT,
@ii INT,
@jj INT,
@FirstIndex INT,
@length INT,
@Value VARCHAR(2000),
@SubmatchValue VARCHAR(2000),
@objSubmatchValue INT,
@command VARCHAR(8000),
@Match_ID INT
DECLARE @match TABLE
(
Match_ID INT IDENTITY(1, 1)NOT NULL,
FirstIndex INT NOT NULL,
length INT NOT NULL,
Value VARCHAR(2000)
)
DECLARE @Submatch TABLE
(
Submatch_ID INT IDENTITY(1, 1),
match_ID INT NOT NULL,
SubmatchNo INT NOT NULL,
SubmatchValue VARCHAR(2000)
)
set @strErrorMessage = 'creating a regex object';
set @error='';
EXEC @hr= sp_OACreate 'VBScript.RegExp', @objRegexExp OUT
IF @hr = 0
set @strErrorMessage = 'Setting the Regex pattern';
set @objErrorObject = @objRegexExp
IF @hr = 0
EXEC @hr= sp_OASetProperty @objRegexExp, 'Pattern', @pattern
IF @hr = 0
set @strErrorMessage = 'Specifying a case-insensitive match'
IF @hr = 0
EXEC @hr= sp_OASetProperty @objRegexExp, 'IgnoreCase', 1
IF @hr = 0
EXEC @hr= sp_OASetProperty @objRegexExp, 'MultiLine', @Multiline
IF @hr = 0
EXEC @hr= sp_OASetProperty @objRegexExp, 'Global', @global
IF @hr = 0
set @strErrorMessage = 'Doing a match'
IF @hr = 0
EXEC @hr= sp_OAMethod @objRegexExp, 'execute', @objMatch OUT,
@matchstring
IF @hr = 0
set @strErrorMessage = 'Getting the number of matches'
IF @hr = 0
EXEC @hr= sp_OAGetProperty @objmatch, 'count', @matchcount OUT
set @ii = 0;
WHILE @hr = 0 AND @ii < @Matchcount
BEGIN
--The Match object has four read-only properties.
--The FirstIndex property indicates the number of characters in the string to the left of the match.
--The Length property of the Match object indicates the number of characters in the match.
--The Value property returns the text that was matched.
set @strErrorMessage = 'Getting the FirstIndex property';
set @command = 'item(' + CAST(@ii AS VARCHAR) + ').FirstIndex'
IF @hr = 0
EXEC @hr= sp_OAGetProperty @objmatch, @command,
@Firstindex OUT
IF @hr = 0
set @strErrorMessage = 'Getting the length property';
set @command = 'item(' + CAST(@ii AS VARCHAR) + ').Length';
IF @hr = 0
EXEC @hr= sp_OAGetProperty @objmatch, @command, @Length OUT
IF @hr = 0
set @strErrorMessage = 'Getting the value property';
set @command = 'item(' + CAST(@ii AS VARCHAR) + ').Value';
IF @hr = 0
EXEC @hr= sp_OAGetProperty @objmatch, @command, @Value OUT
INSERT INTO @match(Firstindex,Length,Value)
values(@firstindex + 1,@Length, @Value);
set @Match_ID = @@Identity;
--The SubMatches property of the Match object is a collection of strings.
--It will only hold values if your regular expression has capturing groups.
--The collection will hold one string for each capturing group.
--The Count property indicates the number of string in the collection.
--The Item property takes an index parameter, and returns the text matched by the capturing group.
--The Item property is the default member, so you can write SubMatches(7) as a shorthand to SubMatches.Item(7).
--Unfortunately, VBScript does not offer a way to retrieve the match position and length of capturing groups.
IF @hr = 0
set @strErrorMessage = 'Getting the SubMatches collection';
set @command = 'item(' + CAST(@ii AS VARCHAR) + ').SubMatches';
IF @hr = 0
EXEC @hr= sp_OAGetProperty @objmatch, @command,@objSubmatches OUT
IF @hr = 0
set @strErrorMessage = 'Getting the number of submatches'
IF @hr = 0
EXEC @hr= sp_OAGetProperty @objSubmatches, 'count', @submatchCount OUT
set @jj = 0
WHILE @hr = 0
AND @jj < @submatchCount
BEGIN
IF @hr = 0
set @strErrorMessage = 'Getting the submatch value property';
set @command = 'item(' + CAST(@jj AS VARCHAR) + ')';
set @submatchValue=null;
IF @hr = 0
EXEC @hr= sp_OAGetProperty @objSubmatches, @command, @SubmatchValue OUT
INSERT INTO @Submatch( Match_ID,SubmatchNo,SubmatchValue)
values(@Match_ID,@jj+1,@SubmatchValue);
set @jj = @jj + 1
END
set @ii = @ii + 1
END
IF @hr <> 0
BEGIN
DECLARE @Source VARCHAR(255),
@Description VARCHAR(255),
@Helpfile VARCHAR(255),
@HelpID INT
EXECUTE sp_OAGetErrorInfo @objErrorObject, @source OUTPUT,
@Description OUTPUT, @Helpfile OUTPUT, @HelpID OUTPUT
set @Error = 'Error whilst '
+ COALESCE(@strErrorMessage, 'doing something') + ', '
+ COALESCE(@Description, '')
END
EXEC sp_OADestroy @objRegexExp
EXEC sp_OADestroy @objMatch
EXEC sp_OADestroy @objSubMatches
insert into @result
(Match_ID,
FirstIndex,
[length],
[Value],
Submatch_ID,
SubmatchValue,
error)
SELECT m.[Match_ID],[FirstIndex],[length],[Value],[SubmatchNo],[SubmatchValue],@error
FROM @match m
LEFT OUTER JOIN @submatchs
ON m.match_ID=s.match_ID;
if @@rowcount=0 and len(@error)>0
insert into @result(error) select @error
return
end
GO
相关推荐
ORACLE SQL正则表达式.pdf 正则表达式是在 Oracle 10g 中添加的新特性,用于匹配字符串中的模式。下面是 ORACLE SQL 正则表达式的相关知识点: 匹配字符 * `[:alnum:]` 匹配任何字母和数字 * `[:alpha:]` 匹配...
这里,`REGEXP`是正则表达式的SQL谓词,`'^[ABCD].*P$'`是一个正则表达式,其中: - `^` 表示字符串的起始位置; - `[ABCD]` 匹配“A”、“B”、“C”或“D”中的任意一个字符; - `.*` 表示任意数量的任意字符; - ...
标题“用正则表达式提取SQL”涉及到的是在编程中如何使用正则表达式来从文本或代码中抓取SQL语句的相关知识。在IT领域,正则表达式(Regular Expression)是一种强大的文本处理工具,它能快速地匹配、查找、替换或者...
### SQL Server 2005 正则表达式的深度解析 #### 引言:正则表达式的威力 正则表达式,在SQL Server 2005中作为一种强大的文本处理工具,极大地增强了数据库处理复杂文本数据的能力。传统的T-SQL虽然在处理数据...
在SQL Server 2008 R2中,虽然标准版并不直接支持正则表达式,但可以通过一些扩展方法和第三方工具来实现正则表达式的功能。这篇文章将详细讲解如何在SQL Server 2008 R2中实现正则表达式处理。 首先,SQL Server ...
在IT领域,SQL语法分析和正则表达式是两种非常重要的技术,它们在处理和解析文本数据时起着至关重要的作用。SQL(Structured Query Language)是用于管理关系数据库的标准语言,而正则表达式则是匹配和操作字符串的...
### RegExp正则表达式 #### 一、正则表达式简介 正则表达式(Regular Expression,简称RegEx或RegExp)是一种强大的文本处理工具,它能够帮助开发者在文本中搜索、替换以及提取特定的字符串模式。正则表达式在多种...
使用正则表达式可以编写简洁、强大的 SQL 语句,提高数据处理的效率和灵活性。熟练使用正则表达式可以帮助用户快速搜索、替换和验证数据,并提供高度的灵活性。 在 Oracle 数据库中,正则表达式的应用非常广泛,...
本文将深入探讨SQL修改表语句以及正则表达式在数据处理中的应用。 **SQL修改表语句** SQL修改表语句允许我们动态地更新数据库中的表结构,以便适应业务需求的变化。以下是一些常见的SQL命令: 1. **添加列 (ALTER...
这些函数的使用方式类似于传统的 SQL 函数 `LIKE`、`INSTR`、`SUBSTR` 和 `REPLACE`,但采用了 POSIX 正则表达式而不是旧式的通配符 `%` 和 `_`。 ##### 1. `REGEXP_LIKE` - **功能**: 类似于 `LIKE` 函数,用于...
在SQL中,正则表达式常用于复杂的数据过滤和查询。MySQL支持使用`REGEXP`和`NOT REGEXP`(或者`RLIKE`和`NOT RLIKE`)操作符来进行正则表达式的模式匹配。 在SQL中,正则表达式有以下一些基本概念和特殊字符: 1. `...
在IT领域,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。在本项目中,“电话号码及日期时间提取(正则表达式 C)”是一个使用C语言编写的程序,它能够从文本中有效地识别...
### 报表工具FineReport正则表达式定义规则 #### 一、正则表达式概述 正则表达式是一种强大的文本处理工具,在多种编程语言中都有应用,它可以帮助我们完成字符串搜索、替换等一系列复杂的文本处理任务。在报表...
Java正则表达式构造SQL语句Java正则表达式构造SQL语句Java正则表达式构造SQL语句
在SQL Server 2000中,虽然标准的正则表达式支持并不内置,但开发者仍然可以通过一些方式来实现正则表达式的功能。这主要依赖于T-SQL的内置函数和一些用户定义的函数(UDF)来模拟正则表达式的行为。下面将详细介绍...
PLSQL.jgcscs、PHPsolo.jgcscs、Ruby.jgcscs分别对应Oracle的PL/SQL、PHP和Ruby语言的正则表达式配置,确保在这些语言中使用的正则表达式能够准确无误地工作。 总的来说,这个“完全自动的正则表达式编写工具”是一...
标题和描述均提到了“正则表达式经典实例”,这暗示了文档可能包含了一系列与正则表达式相关的示例和应用场景。正则表达式(Regular Expression)是一种强大的文本处理工具,用于模式匹配、搜索和替换字符串中的特定...
虽然标准SQL不直接支持正则表达式,但许多数据库系统如MySQL、PostgreSQL、Oracle和SQL Server提供了扩展函数来实现正则表达式的功能,如MySQL的`REGEXP`或SQL Server的`PATINDEX`。 在毕业设计中,正则表达式是一...