2010-01-22 11 views
47

Per PMD Mi piacerebbe avere una regola che mi avvisa di quelle brutte variabili che iniziano con il mio. Ciò significa che devo accettare tutte le variabili che NON iniziano con la mia.La stringa di corrispondenza di RegExp non inizia con il mio

Così, ho bisogno di un RegEx (ri) che si comporta come segue:

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

Ho provato quelle diverse (elencherà qui tardi, mi spiace, non ha accesso a loro in questo momento), ma rifugio' Ha funzionato ancora.

+1

Penso che in realtà dovrebbe essere un aspetto negativo dietro (non uno sguardo negativo avanti). – Indrit

risposta

31

È possibile utilizzare un'asserzione lookahead come altri hanno suggerito. Oppure, se si desidera utilizzare sintassi delle espressioni regolari di base:

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

Ciò corrisponde a stringhe che sono zero o uno caratteri (^.?$) e quindi non può essere my. O stringhe con due o più caratteri in cui, quando il primo carattere non è un m, possono seguire altri caratteri (^[^m].+); oppure se il primo carattere è un m, non deve essere seguito da un (^m[^y]).

+0

Questo è quello che potremmo usare ora. Sembra che ci sia un problema con regexp estesa, ma per ora funziona bene. –

103
^(?!my)\w+$ 

dovrebbe funzionare.

Prima assicura che non sia possibile far corrispondere my all'inizio della stringa e quindi corrisponda ai caratteri alfanumerici fino alla fine della stringa. Gli spazi bianchi in qualsiasi punto della stringa causeranno il malfunzionamento della regex. A seconda del tuo input potresti voler eliminare gli spazi bianchi nella parte anteriore e posteriore della stringa prima di passarli alla regex, oppure utilizzare l'aggiunta di abbinamenti di spazi bianchi facoltativi alla regex come ^\s*(?!my)(\w+)\s*$. In questo caso, backreference 1 conterrà il nome della variabile.

E se è necessario assicurarsi che il nome della variabile inizia con un certo gruppo di personaggi, dicono [A-Za-z_], utilizzare

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

nota il cambiamento +-*.

34
/^(?!my).*/ 

(?!expression) è un lookahead negativo; corrisponde a una posizione in cui expressionnon corrisponde alla partita a partire da quella posizione.

5

Non sarebbe significativamente più leggibile eseguire una corrispondenza positiva e rifiutare quelle stringhe piuttosto che corrispondere al negativo per trovare stringhe da accettare?

/^my/ 
+2

Sarebbe più semplice, ma (era) necessario per una regola che controlla il codice durante il commit su un repository, quindi la logica non può essere "ripristinata". –