Tengo la siguiente expresión regular: /\.([s]?[ac]ss)$/ . El problema es que coincide con .scss , .sass , .css , .ass . ¿Cómo podría hacer que no coincida con .ass ?
Puedes usar
\.(?!a)(s?[ac]ss)$Vea la demostración de expresiones regulares . Detalles :
\. - un punto(?!a) - el siguiente carácter no puede ser a(s?[ac]ss) - Grupo 1: una s opcional, a o c y luego ss$ - final de la cadena.Otra expresión regular que puede funcionar es
\.(s(?:css|ass)|css)$Vea esta demostración de expresiones regulares . Detalles :
\. - un punto(s(?:css|ass)|css) - s y luego css o ass o css$ - final de la cadena. NOTA : si tiene una lista dinámica definida por el usuario de tales cadenas fijas para hacer coincidir después de un archivo . al final de la cadena, puede crear estas expresiones regulares automáticamente usando el código en la parte inferior de mi respuesta .
Además, esto coincidirá solo con .scss , .sass y .css , es muy legible y se explica por sí mismo.
/\.(sc|sa|c)ss$/Otra forma de usar la alternancia:
\.((?:s[ac]|c)ss)$ Aquí, este grupo que no captura (?:s[ac]|c) coincidirá con sa o sc o simplemente con c .
¿Qué tal si solo
/\.(s?css|sass)$/Regex no necesita ser muy complejo para funcionar. Esto es mucho más fácil de leer para otros programadores ( es decir, usted en unos 3 meses ) y hace lo mismo.
Seguro que puedes mezclarlo más, pero ¿por qué lo harías? Las expresiones regulares son lo suficientemente complicadas, mantenlas simples si puedes :)
En su patrón \.([s]?[ac]ss)$ coincide con .ass porque la s inicial es opcional y la clase de carácter [ac] puede coincidir con ambos caracteres.
En su lugar, podría usar aserciones de búsqueda o usar una alternancia | permitir sólo ciertas alternativas.
Algunas otras variaciones podrían ser:
\.(s?c|sa)ss$\. Coincide con un .( Grupo de captura 1s?c|sa Coincide con una s opcional y luego coincide con c o coincide con sa) Cerrar grupo 1ss$ Coincide con ss al final de la cadenaDemostración de expresiones regulares
\.(s[ac]|c)ss$ Una variación del patrón anterior, que ahora coincide con sa o sc o c
Demostración de expresiones regulares
Si en su entorno se admite la aserción lookbehind :
\.s?[ac]ss$(?<!\.ass)\.s? Coincide con un . s opcionales[ac] Coincide con a o css$ Coincide con ss al final de la cadena(?<!\.ass) Negativo mirar atrás, afirmar no .ass a la izquierdaDemostración de expresiones regulares
Tenga en cuenta que si solo desea una coincidencia, también puede usar un grupo que no sea de captura (?:...) en su lugar.