zoukankan      html  css  js  c++  java
  • TSQL中的正则表达式

      本文来自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.

  • 相关阅读:
    Maximum Depth of Binary Tree
    Single Number
    Merge Two Sorted Lists
    Remove Nth Node From End of List
    Remove Element
    Remove Duplicates from Sorted List
    Add Two Numbers
    编译视频直播点播平台EasyDSS数据排序使用Go 语言 slice 类型排序的实现介绍
    RTMP协议视频直播点播平台EasyDSS在Linux系统中以服务启动报错can’t evaluate field RootPath in type*struct排查
    【解决方案】5G时代RTMP推流服务器/互联网直播点播平台EasyDSS实现360°全景摄像机VR直播
  • 原文地址:https://www.cnblogs.com/cxd4321/p/1351927.html
Copyright © 2011-2022 走看看