La cadena coincidente de expresión regular no comienza con mi

89

Para PMD me gustaría tener una regla que me advierte de esas desagradables variables que comienzan con my.
Esto significa que tengo que aceptar todas las variables con las que NO empiecen my.

Entonces, necesito una expresión regular (re) que se comporte de la siguiente manera:

re.match('myVar')       == false
re.match('manager')     == true
re.match('thisIsMyVar') == true
re.match('myOtherVar')  == false
re.match('stuff')       == true

Probé diferentes pero aún no lo he conseguido.

Dominik Sandjaja
fuente
1
Creo que en realidad debería ser una mirada negativa hacia atrás (no una mirada negativa hacia adelante).
Indrit

Respuestas:

43

Puede utilizar una afirmación anticipada como han sugerido otros. O, si solo desea utilizar la sintaxis básica de expresiones regulares:

^(.?$|[^m].+|m[^y].*)

Esto coincide con cadenas que tienen cero o un carácter ( ^.?$) y, por lo tanto, no pueden tener my. O cadenas con dos o más caracteres donde cuando el primer carácter ya no es, mpueden seguir más caracteres ( ^[^m].+); o si el primer carácter es un, mno debe ir seguido de un y( ^m[^y]).

Gumbo
fuente
Este es el que podríamos usar ahora. Parece que hay un problema con la expresión regular extendida, pero esta funciona bien por ahora.
Dominik Sandjaja
165
^(?!my)\w+$

Deberia trabajar.

Primero asegura que no es posible hacer coincidir my al principio de la cadena y luego hace coincidir los caracteres alfanuméricos hasta el final de la cadena. Los espacios en blanco en cualquier parte de la cadena harán que la expresión regular falle. Dependiendo de su entrada, es posible que desee eliminar los espacios en blanco en la parte delantera y trasera de la cadena antes de pasarla a la expresión regular, o usar agregar comparadores de espacios en blanco opcionales a la expresión regular como ^\s*(?!my)(\w+)\s*$. En este caso, la referencia inversa 1 contendrá el nombre de la variable.

Y si necesita asegurarse de que el nombre de su variable comience con un determinado grupo de caracteres, por ejemplo [A-Za-z_], use

^(?!my)[A-Za-z_]\w*$

Tenga en cuenta el cambio de +a *.

Tim Pietzcker
fuente
59
/^(?!my).*/

(?!expression)es una mirada hacia el futuro negativa; coincide con una posición en la expression que no coincide a partir de esa posición.

Ámbar
fuente
7

¿No sería mucho más legible hacer una coincidencia positiva y rechazar esas cadenas, en lugar de hacer coincidir las negativas para encontrar cadenas que aceptar?

/^my/
Víctor Bruno
fuente
4
Eso sería más fácil PERO (era) necesario para una regla que verifica el código al comprometerse con un repositorio, por lo que la lógica no se puede "revertir".
Dominik Sandjaja