Una ayuda usando Regx

kraneok

A ver si alguien me echa una manita. Estoy intentando seleccionar espacios que estén dentro de comas y texto. Me explico.
De una cadena como ,Calle Doña Berenguela, me seleccione los 3 espacios y me los cambie por un guión a, ,Calle-Doña-Bereguenla,.
Lo he intentado de varias formas, pero no soy un experto en esto del Regx, entonces no se realmente si esto es posible o que.

Muchas gracias y saludos.

RoninPiros

No te valdria con seleccionar \s de forma global? si los tienes escritos como en el ejemplo y no hay espacios entre las propias comas y el nombre.

/\s/g;
1 respuesta
bLero

Yo usaría 2 reemplazos, primero reemplazaría las comas (y si quieres también otro tipo de caracteres) por espacios y posteriormente todas las combinaciones de espacios por un guión.

para las comas:

/,/g;

para los espacios:

/\s+\g;
kraneok

#2 De forma global no me vale. Es decir, si tengo por ejemplo "..text texto ,texto texto texto, texto texto..". Me gustaría lograr que la salida al hacer el match sea "..texto texto, texto-texto-texto, texto texto..". La verdad que no ni siquiera si esto es posible xD. Ya mas o menos manejo las Regex, pero esto se me va totalmente de las manos, no sé si hay posibilidad de hacer una selección entre xD.

1 respuesta
Lecherito

#4 Da ejemplos de los casos de uso que quieres.

1- input -> output
2- input2 -> output2

Etc

1 respuesta
kraneok

#5 Ya lo tienes arriba, pero toma.

"..text texto ,texto texto texto, texto texto.." -> "..texto texto,texto-texto-texto, texto texto.."

2 respuestas
Elinombrable

#6 ¿Se va a dar siempre ese caso? ¿Sólo van a existir esas dos comas en todo el texto? ¿Qué pasaría en este caso por ejemplo?

...texto texto, texto texto texto, texto texto texto, texto texto...

¿Tendría que hacerse la sustitución tanto en el primer grupo (entre las dos primeras comas) como en el segundo? (entre la segunda y la tercera coma).

Cuando me digas te pongo la regexp.

Lecherito

#6 Eso no es válido, qué es, un csv?

Por ejemplo si tienes un texto del tipo: "hola, me llamo perico el de los palotes y este soy yo, haciendo el mono, como siempre"

Hay que pillar todo, o cómo se hace?

Vamos, de normal sería coger el texto que hay entre las comas y hacer un replace ahí dentro pero no intentaría hacer todo en un paso, sería un coñazo enorme

2 respuestas
TeNSHi

Algo así, mas una función estilo preg_replace_callback de php igual podría funcionar, creo que es lo que comenta #8:

https://regex101.com/r/pJ4jQ8/1

kraneok

#8 Te pongo en contexto.
Estoy haciendo una simulación de base de datos. Tal y como lo tengo hecho, una querie se compara con una REGEX para saber si viene bien, ejemeplo.

"^(((select|insert|update|delete)\\s+){1}((((\\w+,{1}\\s?)+(\\w+\\s?))|(\\w+\\s?))){1}(\\s+((where){1}\\s+(((\\w+)={1}(\\w+)\\s*))+))?(\\s+((values){1})((\\s+.+\\s?),{1})+(.+\\s?){1})?(;)?)" 

Esto casa con, por ejemeplo:

INSERT CustomerID, CustomerName, CustomerLastName, CustomerAddress, CustomerPhone, CustomerEmail VALUES 22, David, 'Salmerón Zaustre', 'Calle de la Hoz', '987 541 987', david@hotmail.es"

Pero claro, como continúo con mi análisis sintáctico. Esto es la forma que a mi se me ocurriio, puede haber formas mas fáciles. En principio quería partir la cadena por los espacios que quedan en tre VALUES. Así ya se los campos con los que trabajar, sus valores y la acción. Antes de este proceso, toda la cadena se limpia de espacios, como es lógico, menos los espacios de VALUES, que esos si se respetan.

La cuestión es que para no cargarme la cadena también por espacios de una frase con espacios en blanco, se me ocurrió el proceso, antes de pegarlas, ponerles un guión. Así ya puedo volver a trabajar como tenía pensando.

Por cierto, si os lo preguntáis. SI, es un pequeño motor de bases de datos que he programado en Java y que trabajar con ficheros. De momento acepta consultas de inserción y de filtrado xd.

1 respuesta
bLero

#10 Podiamos haber empezado por ahi.

1º. SQL no es un lenguaje regular y por lo tanto no puede ser validado utilizando expresiones regulares. En concreto, se trata de un lenguaje de tipo 2 (Independiente del contexto).

2º. Para poder validarlo necesitas construir un parser.

3º. La forma más eficiente demostrada para construir un parser que valide un lenguaje de tipo 2, es utilizar una gramática (la puedes definir tu o buscarla por la red) y construir los distintos árboles de derivación a partir de tu gramática para cada token que vas leyendo.

4º. Previamente al análisis sintáctico se suele realizar un análisis léxico que sí puedes realizar utilizando expresiones regulares.

5º. Herramientas interesantes que ya te generan un parser a partir de tu gramática y que puedes incorporar a tu proyecto como una librería: Bison o Yacc

1 respuesta
kraneok

#11 La expresioón regultar que he expuesto arriba forma parte de un pequeñísimo analizador sintáctico que he creado. La verdad que es el primer filtro y si te fijas bien, busca algo como : insert a,b,c values d,e,f. O delete where a = b, etc.

No quiero hacer algo mega elaborado por que no es el objetivo, esto forma parte de otro trabajo algo mas grande. Es una práctica simplemente donde el objetivo es el uso de la POO.

Lecherito

Me da cosa esa expresión regular, mucha cosa :(

1 respuesta
kraneok

#13 No mire que sea ineficiente, repito que no es el objetivo xd.

1 respuesta
Lecherito

#14 Ya, pero es ilegible, todos los {1} son inútiles, por ejemplo. Free spacing!

1 respuesta
kraneok

#15 Lo sé es complejo. No soy experto. Yo ya te digo lo que hace, básicamente comprueba una query tipo SQL99. De forma muy simple. De todos modos no es esta la expresión que quiero cambiar, esta de momoento me funciona bien. Es la siguiente, la que me sirve para quitar espacios en blanco y ponerlos como guiones, pero claro, no quiero que sean todos los espacios en blanco. xD

1 respuesta
Elinombrable

#16 Si eso sólo aplica a los Strings y entiendo que los Strings siempre van entre comillas, ¿Por qué no hacer que sustituya los espacios de cualquier texto que vaya entre comillas?

1 respuesta
kraneok

#17 Eso es lo que quiero hacer...Yo pretendía hacerlo en Java el método replaceAll y pasándole la expresión regular. Si se te ocurre otra forma me vale xD.

Usuarios habituales

  • kraneok
  • Elinombrable
  • Lecherito
  • bLero
  • TeNSHi
  • RoninPiros