Disculpe si el título es demasiado vago, no conozco la terminología para este problema, por lo que agradecería mucho cualquier sugerencia.
Patrón actual: ^(?:\/[^\/]*){2}(?:\/tree|)
Idioma/plataforma de destino: JS
Entradas y resultados esperados:
1. /foo/bar pass 2. /foo/bar/tree/baz pass 3. /foo/bar/tree/baz/foobar pass 4. /foo/bar/blob fail 5. /foo/bar/blob/x.js fail Mecanismo de prueba: pattern.test(entryString);
Estas son rutas de GitHub, y lo que estoy tratando de hacer es hacer coincidir un repositorio ( /foo/bar ), o cualquier subruta ( /foo/bar/tree/baz/.... ). El tercer segmento de la ruta debe ser un tree si existe; de lo contrario, la prueba fallará.
El problema con el patrón anterior es que los elementos 4 y 5 aún pasan a pesar de no cumplir ninguna de las condiciones de ese patrón. Probablemente sea un error tonto, pero no puedo averiguar qué es.
Opcionalmente, puede hacer coincidir /tree seguido de repeticiones opcionales o / y otros caracteres además de / y afirmar el final de la cadena $ para evitar coincidencias parciales.
^(?:\/[^\/]*){2}(?:\/tree(?:\/[^\/]*)*)?$Explicación
^ Comienzo de cadena(?:\/[^\/]*){2} Repetir 2 veces / y opcionalmente cualquier carácter excepto /(?: grupo de no captura\/tree Partido /tree(?:\/[^\/]*)* Opcionalmente repetir / cualquier carácter excepto /)? Cierre el grupo de no captura y hágalo opcional$ Fin de la cadenaDemostración de expresiones regulares
Si no necesita hacer coincidir toda la cadena, puede afirmar el final de la cadena en la alternancia:
^(?:\/[^\/\n]*){2}(?:\/tree\/|$)