从字符串中替换/删除类似的子字符串

时间:2016-08-09 12:21:50

标签: sql sql-server

如何从以下测试字符串中删除所有\trxxx子字符串?

blabla\tr568\tr1136\tr1704\tr2272-\tr2840\tr3408\tr3976\tr4544\tr5112\tr5680blabla

获取blabla-blabla

我试过正则表达式,但我失败了:

select REPLACE('blabla\tr568\tr1136\tr1704\tr2272-\tr2840\tr3408\tr3976\tr4544\tr5112\tr5680blabla', '\tr[0-9]+', '')

4 个答案:

答案 0 :(得分:3)

SQL Server缺少正则表达式。您可以使用CLR集成(如果您有数百万条记录,则首选)或使用递归查询。下面是一些测试用例的递归查询示例:

WITH TestCases AS
(
    SELECT * FROM (VALUES
    ('blabla\tr568\tr1136\tr1704\tr2272-\tr2840\tr3408\tr3976\tr4544\tr5112\tr5680blabla'),
    ('\tr23SomeText\tr1'),
    ('bla99bla\tr568\tr1136\tr1704\tr2272-\tr2840\tr3408\tr3976\tr4544\tr5112\tr5680rock'),
    (''),
    (NULL)) T(Expr)
), Cte AS
(
    SELECT 1 R, ROW_NUMBER() OVER (ORDER BY Expr) Rec, CONVERT(varchar(MAX), Expr) Expr
    FROM TestCases
    UNION ALL
    SELECT R+1 R, Rec, CASE
        WHEN PATINDEX('%\tr[0-9][0-9][0-9][0-9]%', Expr)>0 THEN STUFF(Expr, PATINDEX('%\tr[0-9][0-9][0-9][0-9]%', Expr), 7, '')
        WHEN PATINDEX('%\tr[0-9][0-9][0-9]%', Expr)>0 THEN STUFF(Expr, PATINDEX('%\tr[0-9][0-9][0-9]%', Expr), 6, '')
        WHEN PATINDEX('%\tr[0-9][0-9]%', Expr)>0 THEN STUFF(Expr, PATINDEX('%\tr[0-9][0-9]%', Expr), 5, '')
        ELSE STUFF(Expr, PATINDEX('%\tr[0-9]%', Expr), 4, '') END
    FROM Cte
    WHERE PATINDEX('%\tr[0-9]%', Expr)>0
)
SELECT TOP 1 WITH TIES Expr FROM Cte
ORDER BY (ROW_NUMBER() OVER (PARTITION BY Rec ORDER BY R DESC))

它产生:

bla99bla-rock
blabla-blabla
NULL

SomeText

答案 1 :(得分:1)

try

declare @s varchar(Max)='blabla\tr568\tr1136\tr1704\tr2272-\tr2840\tr3408\tr3976\tr4544\tr5112\tr5680blabla'

While PatIndex('%\tr[0-9]%', @s) > 0
        Set @s = REPLACE(@s,SUBSTRING(@s,PATINDEX('%[0-9]%',@s),1),'')

set @s= REPLACE(@s,'\tr','')
select @s

答案 2 :(得分:0)

伪代码:

  1. 从0
  2. 开始获取CHARINDEX(第一个字符串)
  3. 从上次开始获取CHARINDEX(第一个字符串)
  4. STUFF(yourString,step1 + 1的结果,step2的结果,'')

答案 3 :(得分:0)

在我的文本编辑器中,我使用了以下Regex表达式 替换\ tx [0-9] + 什么都没有。

编辑:嗯,这个合成窗口中似乎有一个错误。如上所示,上面的表达式在开头有两个反斜杠

in this screenshot

但是只有一个出现在帖子中。

- 特里,东格林斯特德,英国