Ciąg pasujący do RegExp nie zaczyna się od my


89

W przypadku PMD chciałbym mieć regułę, która ostrzega mnie przed tymi brzydkimi zmiennymi, które zaczynają się od my.
Oznacza to, że muszę akceptować wszystkie zmienne, które NIE zaczynają się od my.

Potrzebuję więc wyrażenia regularnego (re), które zachowuje się w następujący sposób:

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

Próbowałem różnych, ale jeszcze nie działały.


1
Myślę, że właściwie powinno to być negatywne spojrzenie za siebie (a nie negatywne spojrzenie w przyszłość).
Indrit,

Odpowiedzi:


43

Możesz użyć asercji wybiegającej w przód, jak sugerowali inni. Lub, jeśli chcesz po prostu użyć podstawowej składni wyrażeń regularnych:

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

To dopasowuje łańcuchy, które mają długość zera lub jednego znaku ( ^.?$) i dlatego nie mogą być my. Lub łańcuchy z dwoma lub więcej znakami, gdzie pierwszy znak nie jest mjuż więcej, może nastąpić ( ^[^m].+); lub jeśli pierwszy znak to a m, nie może po nim następować y( ^m[^y]).


To jest ten, którego moglibyśmy teraz użyć. Wygląda na to, że wystąpił problem z rozszerzonym wyrażeniem regularnym, ale to na razie działa dobrze.
Dominik Sandjaja

165
^(?!my)\w+$

powinno działać.

Najpierw zapewnia, że ​​nie jest możliwe dopasowanie myna początku ciągu, a następnie dopasowuje znaki alfanumeryczne do końca ciągu. Spacja w dowolnym miejscu w ciągu spowoduje błąd wyrażenia regularnego. W zależności od danych wejściowych możesz chcieć albo usunąć białe znaki z przodu iz tyłu ciągu przed przekazaniem go do wyrażenia regularnego, albo użyć dodawania opcjonalnych dopasowań białych znaków do wyrażenia regularnego, na przykład ^\s*(?!my)(\w+)\s*$. W tym przypadku odwołanie wsteczne 1 będzie zawierało nazwę zmiennej.

A jeśli chcesz się upewnić, że nazwa zmiennej zaczyna się od określonej grupy znaków [A-Za-z_], użyj

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

Zwróć uwagę na zmianę z +na *.


59
/^(?!my).*/

(?!expression)to negatywne spojrzenie w przód; dopasowuje pozycję, w której expression nie pasuje, zaczynając od tej pozycji.


7

Czy nie byłoby znacznie bardziej czytelne wykonanie pozytywnego dopasowania i odrzucenie tych ciągów - zamiast dopasowywania negatywów, aby znaleźć ciągi do zaakceptowania?

/^my/

4
Byłoby to łatwiejsze, ALE było to (było) potrzebne dla reguły, która sprawdza kod podczas zatwierdzania do repozytorium, stąd logika nie może zostać „przywrócona”.
Dominik Sandjaja
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.