sqlserver - replace regex sql server




Realice regex(replace) en una consulta SQL (4)

¿Cuál es la mejor manera de reemplazar todo '& lt' con < en una columna de base de datos dada? Básicamente realizar s/&lt[^;]/</gi

Notas:

  • debe funcionar en MS SQL Server 2000
  • Debe ser repetible (y no terminar con <;;;;;;;;; )

Creo que esto se puede hacer mucho más limpio si usas diferente STUFF :)

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

WHILE 1 = 1
BEGIN
    UPDATE test SET
        val = STUFF( val , PATINDEX('%&lt[^;]%', val) + 3 , 0 , ';' )
    FROM test
    WHERE val LIKE '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
END

select * from test

Hace falta algo de hacking, pero podemos hacerlo con LIKE , PATINDEX , LEFT AND RIGHT y una buena concatenación de cadenas antiguas.

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

while 1 = 1
begin
    update test
        set val = left(val, patindex('%&lt[^;]%', val) - 1) +
                      '&lt;' +
                      right(val, len(val) - patindex('%&lt[^;]%', val) - 2)
    from test
    where val like '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
end

select * from test

Mejor es que esta es una versión de SQL Server independiente y debería funcionar bien.


Si el sabor de la expresión regular de MSSQL admite un look-a-look negativo, esa sería la forma correcta de abordar esto.

s/&lt(?!;)/&lt;/gi

capturará todas las instancias de & lt que no sean seguidas por a ; (incluso si no van seguidos de nada, lo que [^;] se perderá) y no captura lo siguiente no ; personaje como parte del partido, eliminando el problema mencionado en los comentarios sobre la pregunta original de que ese personaje se perdió en el reemplazo.

Lamentablemente, no uso MSSQL, así que no tengo idea de si admite negativos o no ...


Este artículo cubre cómo crear una función Regex Replace simple que puede usar en SQL 2000 (y 2005 con ajustes simples) que puede ayudarlo.





sql-server-2000