La mejor solución ya se ha mencionado:
somefile_(?!16\.txt$).*\.txt
esto funciona, y es lo suficientemente codicioso para tomar todo lo que venga de ella en la misma línea. Si usted sabe, sin embargo, que desea un nombre de archivo válido, me gustaría sugerir también la limitación de caracteres no válidos:
somefile_(?!16)[^?%*:|"<>]*\.txt
Si está trabajando con un motor de expresiones regulares que no admite la búsqueda hacia delante, tendrá que ¡Considera cómo compensar eso! 16. Puede dividir los archivos en dos grupos, aquellas que comienzan con 1, y no son seguidos por 6, y los que comienzan con cualquier otra cosa:
somefile_(1[^6]|[^1]).*\.txt
Si desea permitir somefile_16_stuff.txt pero NO somefile_16.txt , estas expresiones rectas anteriores no son suficientes. Tendrá que establecer su límite diferente:
somefile_(16.|1[^6]|[^1]).*\.txt
Combine todo esto, y se termina con dos posibilidades, una que bloquea la instancia única (somefile_16.txt), y uno que bloquea todas las familias (somefile_16 * .txt). Yo personalmente creo que se prefiere la primera de ellas:
somefile_((16[^?%*:|"<>]|1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
somefile_((1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
En la versión sin quitar caracteres especiales por lo que es más fácil de leer:
somefile_((16.|1[^6]|[^1).*|1)\.txt
somefile_((1[^6]|[^1]).*|1)\.txt
¿Probablemente quiera un? allí de la siguiente manera: somefile (?! 16). *? \. txt –
@Martin Brown: ¿Por qué? . *? es afaik inválido en la mayoría de los dialectos. . significa cualquier carácter, * cero o más ocurrencias. ¿Qué debería hacer el signo de interrogación? – phihag
@phihag:. *? significa hacer el. * no codicioso. Es un uso especial del signo de interrogación. –