首页 > 开发 > 综合 > 正文

T-SQL中的正则表达式

2024-07-21 02:08:22
字体:
来源:转载
供稿:网友
中国最大的web开发资源网站及技术社区,

t-sql中的正则表达式


原作者:cory koski
发表时间:2003/06/24


        本文来自cory koski。cory写道:“我最近遇到一个问题,就是试图在数据库域中搜索一个正则表达式。还没有一个版本的sqlserver内部支持正则表达式,但我发现了一个将正则表达式的所有优点添加到你的t_sql应用的方法。为了更容易的使用正则表达式,我们可以使用自定义函数(user defined function, udf)来帮助我们并使工作简洁。”

在这个解决方案中,我们需要sql server 2000或更高。我们还需要确定机器中有vbscript.regexp类库,这随大多数windows 2000 servers中的windows scripting包配有。若你正在使用一个更早版本的windows,你必须为你的操作系统下载最新版的windows scripting。
自定义函数
下面是我的自定义函数,可用来在源字符串中搜索一个正则模式表达式。
create function dbo.find_regular_expression
 (
  @source varchar(5000),
  @regexp varchar(1000),
  @ignorecase bit = 0
 )
returns bit
as
 begin
  declare @hr integer
  declare @objregexp integer
  declare @objmatches integer
  declare @objmatch integer
  declare @count 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
  exec @hr = sp_oadestroy @objregexp
  if @hr <> 0 begin
   set @results = 0
   return @results
  end
 return @results
 end

将这个udf保存到你的数据库中,并确定有授权来运行它。当然,你也得确保运行它的人有运行sp_oaxxxxx类扩展存储过程的权限。
这个函数已确保正常运行,并且即便是和com对象一起使用,也还是挺快的。

举例
使用正则表达式的一个地方就是测试特殊字符。我们不搜索所有的特殊字符,而是查找正常字符的匹配项,例如字母和空格。我们看看它的运行。
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
the results for this example would be:
本例的结果应该是:
test one this is a test!!
special characters found.
---
test two this is a test
no special characters.

结论:
正如你所见,这是一个简单技巧,在特定的场合得到了非常有用的结果。你作为一个t_sql开发人员,可以在正则表达式库vbscript.regexp中使用和扩展这个技巧。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表