0

Estoy tratando de buscar variables, lo hago con regex.

Mi primera regex hace algo como:

  • Empieza con var,
  • luego pueden repetirse espacios 1 o más veces,
  • seguido de 1 o más letras,

y hasta ahí me funciona bien.

El problema es que estaba buscando algo para hacer un XOR en regex. ¿Por qué necesitaría eso? Porque una variable puede ser:

var a, b o var a; por lo que solo se debe cumplir o a, o a; , por eso una disyunción exclusiva (XOR).

Lo que encontré fué: ^(,|;){1}$, aunque me sirve si solo tengo una coma y un punto y coma, pero NO me sirve si está todo junto osea, var a, o var a;

Además de mi problema, ¿por qué a ese regex le agregan ^ y $, por qué el patrón se conforma de esa manera?

(function(){
 var text = "var a, b;"
 var regex = /var\s+[a-z]+/ig;
 if(regex.test(text)) console.log(text.match(regex));
})();

var newRegex = /var\s+[a-z]+(^(,|;){1}$)0/ig;
if(newRegex.test("var a,b;")) console.log("Done"); 
Mariano
  • 23,777
  • 20
  • 70
  • 102
Eduardo Sebastian
  • 4,908
  • 7
  • 30
  • 70
  • El resultado esperado es `var a,` o `var a;`? ¿Por qué no [`/var\s+[-\w]+\s*[,;]/g`](https://regex101.com/r/RsWKR8/1)? – Mariano Nov 20 '17 at 23:52
  • O sea, creo que son temas que ya estaban respondidos en https://es.stackoverflow.com/a/117171/127 – Mariano Nov 21 '17 at 00:24

1 Answers1

2

var a, o var a; por lo que solo se debe cumplir o a, o a;

Fácil, la clase de caracteres [,;] coincide con 1 solo caracter: una coma o un punto y coma.

/var\s+[-\w]+\s*[,;]/g

Demo



algo para hacer un XOR en regex

Por cómo funciona el motor de expresiones regulares, no hay diferencia entre un OR y un XOR. Hay que tener en cuenta que coincide con un subpatrón o con otro (o con ninguno), por lo que no tenemos un caso en el cual un XOR aplicaría... Quizás si esa estructura estuviese repetida con un cuantificador, pero ahí ya sería otro caso.

En fin, si fuese un OR para más de un caracter, donde no podemos usar una clase de caracteres,

(?:subpatrón1|subpatrón2)


Lo que encontré fue: ^(,|;){1}$

[...] Además de mi problema, por qué a ese regex le agregan ^ y $

No sé por qué está con ^ y $ (habrá que preguntarle al autor), probablemente porque sea una respuesta a cómo coincidir con una coma o un punto y coma como único caracter en el texto, pero está mal usarlo dentro de tu patrón sin sacarle el ^ y el $.

Además, el {1} no tiene sentido, es totalmente innecesario. (,|;){1} es lo mismo que (,|;).

Y por último, evitaría crear grupos innecesarios, quedando: (?:,|;).

Pero, de nuevo, esto tiene sentido para más de 1 caracter. Si es un único caracter, es muchísimo más eficiente y sencillo de leer como:

[,;]
Mariano
  • 23,777
  • 20
  • 70
  • 102
  • Gracias Mariano, aprenderé aún más acerca de los grupos ! – Eduardo Sebastian Nov 21 '17 at 00:37
  • @EduardoSebastian Esta va de yapa: https://regex101.com/r/3UpJC8/2 (sólo funciona en [navegadores modernos](http://kangax.github.io/compat-table/es6/#test-RegExp_y_and_u_flags)) – Mariano Nov 21 '17 at 00:56
  • wow, intentaré estudiarlo y así aprender más, muchísimas gracias – Eduardo Sebastian Nov 21 '17 at 01:05
  • Con una pequeña corrección: https://regex101.com/r/3UpJC8/3 y demo en https://jsfiddle.net/marianom/0g2u2ymc/ (no acepta `,` ni `;` entre comillas dentro del valor de una variable, pero eso te queda como tarea :-)) – Mariano Nov 21 '17 at 01:32
  • (no está optimizada, tiene varias cosas para mejorar, pero era para darte una idea del tipo de solución delo que creo que estás buscando) – Mariano Nov 21 '17 at 01:45