2010-01-22 10 views
47

Für PMD Ich hätte gerne eine Regel, die mich vor diesen hässlichen Variablen warnt, die mit meinem beginnen. Dies bedeutet, dass ich alle Variablen akzeptieren muss, die NICHT mit meinem beginnen.RegExp passende Zeichenfolge nicht mit meinem

Also, ich brauche eine RegEx (re), die wie folgt verhält:

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

ich unterschiedliche versucht haben (werden sie hier später Liste, sorry, kein Zugang zu ihnen jetzt), aber haven‘ Es hat noch funktioniert.

+1

Ich denke, dass eigentlich ein negativer Blick dahinter sein sollte (kein negativer Ausblick). – Indrit

Antwort

31

Sie können entweder eine Lookahead-Assertion verwenden, wie von anderen vorgeschlagen. Oder, wenn Sie nur grundlegende Syntax für reguläre Ausdrücke verwenden möchten:

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

Das passt Strings, die sind entweder null oder ein Zeichen lang sein (^.?$) und damit nicht my sein kann. Oder Zeichenfolgen mit zwei oder mehr Zeichen. Wenn das erste Zeichen kein m Zeichen ist, können weitere Zeichen folgen (^[^m].+); oder wenn das erste Zeichen ein m ist, darf ihm kein y (^m[^y]) folgen.

+0

Dies ist die eine, die wir jetzt verwenden könnten. Scheint so, als ob es ein Problem mit der erweiterten Regexp gibt, aber dieses funktioniert jetzt gut. –

103
^(?!my)\w+$ 

sollte funktionieren.

Es stellt zuerst sicher, dass my am Anfang der Zeichenfolge nicht übereinstimmt und alphanumerische Zeichen dann bis das Ende der Zeichenfolge übereinstimmt. Whitespace irgendwo in der Zeichenfolge wird dazu führen, dass die Regex fehlschlägt. Abhängig von Ihrer Eingabe möchten Sie möglicherweise Leerzeichen in der Vorder- und Rückseite der Zeichenfolge entfernen, bevor Sie sie an die Regex übergeben, oder verwenden Sie optionale Whitespace-Matcher zur Regex wie ^\s*(?!my)(\w+)\s*$. In diesem Fall enthält die Rückreferenz 1 den Namen der Variablen.

Und wenn Sie müssen sicherstellen, dass Ihre Variablennamen mit einer bestimmten Gruppe von Zeichen beginnt, sagen [A-Za-z_],

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

Beachten Sie die Änderung +-* verwenden.

34
/^(?!my).*/ 

(?!expression) ist ein negativer Lookahead; es entspricht einer Position, in der expressionnicht übereinstimmen beginnt an dieser Position.

5

Wäre es nicht wesentlich besser lesbar, eine positive Übereinstimmung zu machen und diese Strings abzulehnen - anstatt das Negativ zu finden, um Strings zu akzeptieren?

/^my/ 
+2

Das wäre einfacher, aber es war (war) für eine Regel benötigt, die den Code beim Commit zu einem Repository überprüft, daher konnte die Logik nicht "zurückgesetzt" werden. –

Verwandte Themen