En nuestra aplicación tenemos temas que el usuario puede crear, y cada tema debe tener su propio hashtag (o jerarquía de hashtags). Tenemos este tipo de expresiones regulares para la validación:
const REGEX_HASHTAG = /^(#[w]?((\/?)([a-z0-9]+)+)+)(,\s{0,1}#[a-z0-9]?((\/?)([a-z0-9]+)+)+)*$/g;
Lo que necesito es que el usuario pueda crear hashtags que tengan una estructura como esta:
Y también los usuarios pueden poner comas (y espacios en blanco opcionales) seguidos de un nuevo hashtag o jerarquía de hashtag. Cuando pongo demasiadas letras y hago una barra al final, Regex deja de funcionar, tarda demasiado en ejecutarse. ¿Qué estoy haciendo mal?
regexr.com/6hpqo
Hay bastantes cuantificadores anidados y partes opcionales, que pueden causar retrocesos catastróficos cuando no hay coincidencia.
Podrías escribir el patrón como
^#[a-z0-9]+(?:\/[a-z0-9]+)*(?:,\s*#[a-z0-9]+(?:\/[a-z0-9]+)*)*$
^
Comienzo de cadena#[a-z0-9]+
Match # y 1+ repeticiones de los caracteres enumerados en la clase de caracteres(?:\/[a-z0-9]+)*
Opcionalmente repetir /
y la misma clase de carácter(?:
grupo de no captura,\s*
Coincide con una coma y caracteres de espacio en blanco opcionales#[a-z0-9]+(?:\/[a-z0-9]+)*
El mismo patrón que en la primera parte)*
Cerrar el grupo de no captura y opcionalmente repetirlo$
Fin de la cadena