Estoy tratando de validar el nombre de archivo o las porciones de directorio de una cadena que eventualmente se usará en una URL y quiero rechazar los caracteres que no sean Unicode y otros, la expresión regular está devolviendo bytes nulos.
Dada esta cadena como entrada:
զվարճ?անք9879#jhkjhkhl!kjljlkjlkjj()+======\_ew.html /(?![\p{L}]|[\p{N}]|[\._-~])/gu
JavaScript devuelve coincidencias correctas de caracteres no válidos, pero selecciona un byte nulo para cada carácter coincidente y no el carácter completo.
Si ejecuto lo contrario y trato de hacer coincidir los caracteres que están bien en lugar de no estar bien:
/[\p{L}]|[\p{N}]|[\._-~]/gu
JavaScript devuelve coincidencias y selecciona cada carácter válido como se esperaba, sin coincidencias de bytes nulos.
Cada patrón tiene la bandera /u . No entiendo la diferencia de comportamiento. Probé esto en el último Chrome (actualización 100 a partir de la fecha de publicación), Safari y Firefox y todos se comportan de la misma manera.
¿Hay algún indicador u operador de que falta la primera expresión regular o se trata de un error/limitación de JavaScript?
No estás igualando, solo afirmando. Puede hacer coincidir un solo carácter justo después de la afirmación y agrupar la alternancia en una sola clase de carácter:
(?![\p{L}\p{N}._-~]).Demostración de expresiones regulares 101
O puede hacer coincidir 1 o más veces lo opuesto usando una clase de carácter negado que comience con [^
[^\p{L}\p{N}._-~]+Demostración de expresiones regulares 101
Tenga en cuenta que esta parte en la clase de caracteres _-~ denota un rango en lugar de caracteres _ - ~
Si desea hacer coincidir el carácter - , puede escaparlo o colocarlo al principio o al final de la clase de caracteres.