RegExp-Matching-String, der nicht mit meinem beginnt

85

Für PMD hätte ich gerne eine Regel, die mich vor den hässlichen Variablen warnt, die mit beginnen my.
Dies bedeutet, dass ich alle Variablen akzeptieren muss, die NICHT mit beginnen my.

Ich brauche also ein RegEx (re), das sich 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 habe verschiedene ausprobiert, aber noch nicht funktioniert.

Dominik Sandjaja
quelle
1
Ich denke, das sollte eigentlich ein negativer Blick nach hinten sein (kein negativer Blick nach vorne).
Indrit

Antworten:

40

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

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

Dies entspricht Zeichenfolgen, die entweder null oder ein Zeichen lang sind ( ^.?$) und daher nicht sein können my. Oder Zeichenfolgen mit zwei oder mehr Zeichen, bei denen, wenn das erste Zeichen mkein weiteres Zeichen ist, weitere Zeichen folgen können ( ^[^m].+); oder wenn das erste Zeichen a ist m, darf kein y( ^m[^y]) folgen .

Gumbo
quelle
Dies ist die, die wir jetzt verwenden könnten. Es scheint, als gäbe es ein Problem mit dem erweiterten regulären Ausdruck, aber dieser funktioniert vorerst einwandfrei.
Dominik Sandjaja
160
^(?!my)\w+$

sollte arbeiten.

Zunächst wird sichergestellt, dass myam Anfang der Zeichenfolge keine Übereinstimmung möglich ist , und anschließend werden alphanumerische Zeichen bis zum Ende der Zeichenfolge abgeglichen. Leerzeichen an einer beliebigen Stelle in der Zeichenfolge führen dazu, dass der reguläre Ausdruck fehlschlägt. Abhängig von Ihrer Eingabe möchten Sie möglicherweise entweder Leerzeichen an der Vorder- und Rückseite der Zeichenfolge entfernen, bevor Sie sie an den regulären Ausdruck übergeben, oder optionale Leerzeichen-Matcher zum regulären Ausdruck hinzufügen ^\s*(?!my)(\w+)\s*$. In diesem Fall enthält die Rückreferenz 1 den Namen der Variablen.

Und wenn Sie sicherstellen müssen, dass Ihr Variablenname mit einer bestimmten Gruppe von Zeichen beginnt [A-Za-z_], verwenden Sie beispielsweise

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

Beachten Sie den Wechsel von +zu *.

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

(?!expression)ist ein negativer Lookahead; Es entspricht einer Position, an expression der ab dieser Position nicht mehr übereinstimmt.

Bernstein
quelle
7

Wäre es nicht wesentlich besser lesbar, eine positive Übereinstimmung zu erzielen und diese Zeichenfolgen abzulehnen, anstatt mit der negativen übereinzustimmen, um zu akzeptierende Zeichenfolgen zu finden?

/^my/
Victor Bruno
quelle
4
Das wäre einfacher, ABER es wurde (wurde) für eine Regel benötigt, die den Code beim Festschreiben in ein Repository überprüft, daher konnte die Logik nicht "zurückgesetzt" werden.
Dominik Sandjaja