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.

  • 相关阅读:
    螺旋矩阵算法
    shell脚本编程的10个最佳实践
    时间字符串转长整形数
    python的发音
    wget使用技巧
    History命令用法15例
    14位格式时间字符串
    Spring MVC
    Android SQLite数据储存方式
    MYSQL命令大全
  • 原文地址:https://www.cnblogs.com/cxd4321/p/1351927.html
Copyright © 2011-2022 走看看