RegExp che corrisponde alla stringa che non inizia con my


93

Per PMD vorrei avere una regola che mi avverta di quelle brutte variabili che iniziano con my.
Ciò significa che devo accettare tutte le variabili che NON iniziano con my.

Quindi, ho bisogno di una RegEx (re) che si comporti come segue:

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

Ne ho provati di diversi ma non ho ancora funzionato


1
Penso che in realtà dovrebbe essere uno sguardo negativo dietro (non uno sguardo negativo al futuro).
Indrit

Risposte:


43

Potresti usare un'asserzione anticipatrice come altri hanno suggerito. Oppure, se desideri utilizzare solo la sintassi delle espressioni regolari di base:

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

Questo corrisponde a stringhe che sono lunghe zero o un carattere ( ^.?$) e quindi non possono esserlo my. Oppure stringhe con due o più caratteri dove quando il primo carattere non è un m, possono seguire più caratteri ( ^[^m].+); oppure se il primo carattere è a, mnon deve essere seguito da una y( ^m[^y]).


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

169
^(?!my)\w+$

dovrebbe funzionare.

Innanzitutto garantisce che non sia possibile trovare una corrispondenza myall'inizio della stringa, quindi corrisponde ai caratteri alfanumerici fino alla fine della stringa. Gli spazi vuoti in qualsiasi punto della stringa causeranno il fallimento della regex. A seconda del tuo input potresti voler rimuovere gli spazi bianchi nella parte anteriore e posteriore della stringa prima di passarla all'espressione regolare, oppure utilizzare aggiungi abbinatori di spazi bianchi opzionali all'espressione regolare come ^\s*(?!my)(\w+)\s*$. In questo caso, il backreference 1 conterrà il nome della variabile.

E se devi assicurarti che il nome della tua variabile inizi con un certo gruppo di caratteri, ad esempio [A-Za-z_], usa

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

Nota il cambiamento da +a *.


63
/^(?!my).*/

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


7

Non sarebbe significativamente più leggibile fare una corrispondenza positiva e rifiutare quelle stringhe, piuttosto che abbinare il negativo per trovare stringhe da accettare?

/^my/

4
Sarebbe più facile MA era (era) necessario per una regola che controlla il codice quando si effettua il commit in un repository, quindi la logica non poteva essere "ripristinata".
Dominik Sandjaja
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.