2010-01-22 8 views
47

Para PMD Me gustaría tener una regla que me advierta sobre esas feas variables que comienzan con mi. Esto significa que tengo que aceptar todas las variables que NO comienzan con mi.Cadena de coincidencia de RegExp no comenzando con

lo tanto, necesito una expresión regular (re) que se comporta de la siguiente manera:

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

He intentado otras diferentes (los listará aquí más tarde, lo siento, no tienen acceso a ellos en este momento), pero Haven' Ya lo tengo trabajando.

+1

Creo que en realidad debería ser una mirada negativa detrás (no una mirada negativa hacia adelante). – Indrit

Respuesta

31

Puede utilizar una aserción de búsqueda anticipada como otros han sugerido. O bien, si lo que desea es utilizar la sintaxis de expresión regular básica:

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

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

+0

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. –

103
^(?!my)\w+$ 

debería funcionar.

Primero se asegura de que no sea posible hacer coincidir my al comienzo de la cadena, y luego coincide con los caracteres alfanuméricos hasta el final de la cadena. El espacio en blanco en cualquier lugar de la cadena hará que la expresión regular falle. Dependiendo de su entrada, es posible que desee quitar el espacio en blanco en la parte frontal y posterior de la cadena antes de pasarlo 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 es necesario asegurarse de que su nombre de la variable comienza con un grupo determinado de caracteres, dicen [A-Za-z_], utilice

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

nota el cambio de + a *.

34
/^(?!my).*/ 

(?!expression) es un lookahead negativo; coincide con una posición donde expressionno coincide comenzando en esa posición.

5

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

/^my/ 
+2

Eso sería más fácil PERO (fue) necesario para una regla que verifica el código cuando se compromete con un repositorio, por lo tanto, la lógica no se puede "revertir". –

Cuestiones relacionadas