Free Trial

Foro

RESUELTAS

Regex para reemplazar

grchavarri
Bólido

Buenas tardes querida comunidad, 

 

Estoy tratando de resolver un problema con regex, a ver si me podeis ayudar. 

Estoy buscando una expresión regular para limpiar un json que haga lo siguiente: 

 

Quiero reemplazar todas las comillas " y las comas , dentro de una expresión. Pongo el ejemplo con el que me estoy rompiendo la cabeza. 

 

La cadena a transformar es la siguiente:
 
,"location":"Josue Tejero "el Guarda", Villarrubia","minPrice":"0,"
 
y el resultado tiene que ser:
 
,"location":"Josue Tejero el Guarda Villarrubia","minPrice":0,"
 
Por tanto habría que reemplazar esos caracteres, haciendo que reconozca toda la cadena entre ":" y "," (marco los caracteres que habría que quitar)
 
,"location":"Josue Tejero "el Guarda", Villarrubia","minPrice":0,"
 
Alguna idea?
Muchas gracias de antemano
 
Saludos,
7 RESPUESTAS 7
Aguisande
15 - Aurora
15 - Aurora

Hola @grchavarri 

Descarto que hacer un JSON parse no es una opción (aunque podrías lograr este objetivo sumarizando luego)

 

Qué tal si probamos esto, usando Replace y ReplaceChar solamente:

 

- Hacer un replace de ":" y otros patrones que quieras reemplazar por otro separador (por ejemplo: ~) --> Replace([campo] , '":"',"~") <-- atención a las comillas simple y dobles

- Luego, reemplazar las comillas existentes con vacío (ReplaceChar('"',"")

- Finalmente volver a reemplazar el separador temporal (~)  por ":"

 

Esto debería resolver tu problema actual (por lo menos mientras busco cómo se arma el regex)

 

grchavarri
Bólido

Buenas @Aguisande 

 

La verdad es que es una solución posible, la unica historia es que estoy haciendo esto porque el json parser no me lee el total del texto descargado y no me lee bien los campos porque estan esas "" ahi y esas , que hacen desestructurar el json.

 

Por eso tengo que reemplazar eso concretamente, el problema viene en que todos los campos string del json se comportan igual, empiezan por ":" y acaban por "," porque tendrían una estructura tipo "field":"juan","Pricemin":0, Asi que tengo ciertas dudas de si haciendo eso podre o no fastidiar otras partes del asunto. 

 

Lo voy a probar y te voy contando. 

 

Ya he encontrado una parte de la expresión, \"\:\"(.*?)\"\,\" , esto seleccionaría el interior de lo que buscamos, pero ahora como le diriamos que solo selecciones los caracteres no numericos ni letras? Estoy buscando pero no encuentro la forma. 


por otra parte creo que alteryx tiene un pequeño fallo en esta estrcutura, porque con esa regex qu ehe puesto arriba, si tokeniza, saca bien las cosas sin el ":" y el "," pero cuando reemplaza, lo reemplaza todo, cosa que creo que funciona mal, porque se supone que los ( ) son para encapsular lo interior y no incluir lo delimitadores, pero no soy ningun experto. 

 

Muchas gracias por la ayuda.

 

Aguisande
15 - Aurora
15 - Aurora

Podrás pasar aunque sea un pequeño ejemplo del json para revisarlo?

 

grchavarri
Bólido

@Aguisande Encontré la solución gracias a un amigo que le ha pegado duro a las regex. Muchas gracias por la ayuda como siempre

 

Os dejo aqui la expresión por si a alguien le puede valer de base. 

 

(?<!\:|,|{)"(?!\:|,|})|(?<!\:|,|{)",(?!")

 

saludos,

Aguisande
15 - Aurora
15 - Aurora

Podrás probar ambas alternativas para ver cuánto tardan en ejecutar cada una?

grchavarri
Bólido

Maestro @Aguisande ,

 

He ejecutado ambas y tarda menos con la regex directamenre, ya que al hacer los separadores temporales tengo que hacer formula tool mas regex ya que para evitar desmontar y montar el json, tengo que hacerlo sin romper la cadena en trozos. 

 

¿Es el resultado esperado?

Disculpa la demora en contestar, que no tuve rato para montar la solución que me planteabas hasta ahora. 

 

Abrazo,

Aguisande
15 - Aurora
15 - Aurora

Hola,

Totalmente lógico el resultado.

Saludos

Etiquetas