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.
regex
regex-negation
pmd
Dominik Sandjaja
źródło
źródło
Odpowiedzi:
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 jestm
już więcej, może nastąpić (^[^m].+
); lub jeśli pierwszy znak to am
, nie może po nim następowaćy
(^m[^y]
).źródło
^(?!my)\w+$
powinno działać.
Najpierw zapewnia, że nie jest możliwe dopasowanie
my
na 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*
.źródło
/^(?!my).*/
(?!expression)
to negatywne spojrzenie w przód; dopasowuje pozycję, w którejexpression
nie pasuje, zaczynając od tej pozycji.źródło
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/
źródło