2016-08-09 26 views
0

Wie entfernen Sie alle \trxxx Teilzeichenfolgen aus folgenden Testzeichenfolge?Ähnliche Teilzeichenfolgen aus Zeichenfolge ersetzen/entfernen

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

Um blabla-blabla zu erhalten?

Ich habe regex versucht, aber ich schlug fehl:

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

Ihr gewünschtes Ergebnis ist –

+0

Dank nicht klar ist, ist es besser? – gaffcz

+0

Sql-Server unterstützt nur einen sehr kleinen Teil von Regex, siehe https://msdn.microsoft.com/en-us/library/ms179859.aspx – Serg

Antwort

3

SQL Server fehlt Regex. Sie können CLR-Integration verwenden (bevorzugt, wenn Sie Millionen von Datensätzen haben) oder eine rekursive Abfrage verwenden. Beispiel für rekursive Abfrage mit einigen Testfällen unter:

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)) 

Es ergibt:

bla99bla-rock 
blabla-blabla 
NULL 

SomeText 
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 
+1

Es wird manchmal zu viel gelöscht. "" Bla99bla \ tr568 \ tr1136 \ tr1704 \ tr2272 - \ tr2840 \ tr3408 \ tr3976 \ tr4544 \ tr5112 \ tr5680blabla'' – Serg

+0

Schön, aber es dauert wirklich zu viel. Ich möchte nur Zahlen entfernen, die hinter \ tr sind – gaffcz

0

Pseudo-Code:

  1. erhalten CHARINDEX (1. String) ab 0
  2. erhalten CHARINDEX (1. String) ausgehend von der letzten
  3. STUFF (yourString, Ergebnis von Schritt1 + 1, Ergebnis von Schritt2, '')
0

In meinem Texteditor verwenden ich den folgenden Regex Ausdruck Ersetzen \ tx [0-9] + Mit nichts .

EDIT: Hmm, es scheint ein Bug in diesem Kompositionsfenster. Der Ausdruck oben hat zwei Schrägstriche am Anfang, wie Sie

in this screenshot

sehen Aber nur eine erscheint in der Post.

- Terry, East Grinstead, UK