如何从以下测试字符串中删除所有\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]+', '')
答案 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)
伪代码:
答案 3 :(得分:0)
在我的文本编辑器中,我使用了以下Regex表达式 替换\ tx [0-9] + 什么都没有。
编辑:嗯,这个合成窗口中似乎有一个错误。如上所示,上面的表达式在开头有两个反斜杠但是只有一个出现在帖子中。
- 特里,东格林斯特德,英国