假设我有以下正则表达式模式:
%[a-zA-Z0-9+&@#\/%=~_|$?!-:,.']%
我如何迭代字符串字符并删除(或替换为空白)任何与该模式不匹配的字符?
答案 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