SQL删除不是正则表达式模式中的字符

时间:2016-01-13 16:08:37

标签: sql-server regex tsql

假设我有以下正则表达式模式:

%[a-zA-Z0-9+&@#\/%=~_|$?!-:,.']%

我如何迭代字符串字符并删除(或替换为空白)任何与该模式不匹配的字符?

3 个答案:

答案 0 :(得分:3)

此:

PatIndex('%[^a-zA-Z0-9+&@#\/%=~_|$?!-:,.']%', YourValue)

将返回模式匹配的字符。在这种情况下,我在开头添加了^,以便模式匹配字符集中 not 的所有内容。

然后,您可以删除该位置的字符,然后继续或替换整个字符串中找到的所有字符。

仅供参考:要模拟offset CharIndex参数以便从某个字符位置开始搜索,您可以使用Substring来获取字符串的一部分(甚至一个字符)并使用PatIndex

答案 1 :(得分:2)

好的,基于ErikE的帮助,我做了以下功能

     CREATE FUNCTION dbo.RemoveInvalidCharacters
 (
@pattern as varchar(max),
@string as varchar(max)
)
RETURNS varchar(MAX)
AS
BEGIN

    WHILE PatIndex(@pattern,@string) >0
      BEGIN
      SET @string=REPLACE(@string,SUBSTRING(@string,PatIndex(@pattern,@string),1),'')
END
RETURN @String

END
GO   

然后我所做的就是将函数调用为:

  select dbo.RemoveInvalidCharacters('%[^a-zA-Z0-9+&@#\/%=~_|$?!:,.''-]%','Test€€€String^^^')

然后输出是: TestString

答案 2 :(得分:0)

正如ErikE在他的回答中提到的那样,PATINDEX方法就是你所需要的,但它是 SLOW

关于SO的一个非常相似的问题的答案是stackoverflow.com/a/23001916/4316831。以下代码取自:

DECLARE @counter int

SET @counter = 0

WHILE(@counter < (SELECT MAX(ID_COLUMN) FROM Table))
BEGIN  

    WHILE 1 = 1
    BEGIN
        DECLARE @RetVal varchar(50)

        SET @RetVal =  (SELECT Column = STUFF(Column, PATINDEX('%[^0-9.]%', Column),1, '')
        FROM Table
        WHERE ID_COLUMN = @counter)

        IF(@RetVal IS NOT NULL)       
          UPDATE Table SET
          Column = @RetVal
          WHERE ID_COLUMN = @counter
        ELSE
            break
    END

    SET @counter = @counter + 1
END