Nie udało mi się znaleźć odpowiedniego wyrażenia regularnego pasującego do dowolnego ciągu nie kończącego się jakimś warunkiem. Na przykład nie chcę dopasowywać niczego, co kończy się na a
.
To pasuje
b
ab
1
To nie pasuje
a
ba
Wiem, że wyrażenie regularne powinno kończyć się, $
aby zaznaczyć koniec, choć nie wiem, co powinno go poprzedzić.
Edycja : oryginalne pytanie nie wydaje się być dobrym przykładem dla mojej sprawy. Więc: jak poradzić sobie z więcej niż jedną postacią? Powiedz, że coś się nie kończy ab
?
Udało mi się to naprawić za pomocą tego wątku :
.*(?:(?!ab).).$
Chociaż wadą jest to, że nie pasuje do ciągu jednej postaci.
Odpowiedzi:
Nie podajesz nam języka, ale jeśli twoje wsparcie smaku wyrażenia regularnego wygląda za asercją , oto czego potrzebujesz:
(?<!a)
to negowane twierdzenie, które zapewnia, że przed końcem łańcucha (lub wiersza zm
modyfikatorem) nie będzie znaku „a”.Zobacz to tutaj na Regexr
Możesz również z łatwością rozszerzyć to o inne znaki, ponieważ to sprawdzanie łańcucha i nie jest klasą znaków.
To pasowałoby do wszystkiego, co nie kończy się na „ab”, zobacz to na Regexr
źródło
Użyj symbolu not (
^
):Jeśli umieścisz
^
symbol na początku nawiasów, oznacza to „wszystko oprócz rzeczy w nawiasach”.$
jest po prostu kotwicą do końca.W przypadku wielu znaków po prostu umieść je wszystkie we własnym zestawie znaków:
źródło
ae
lubcb
.Aby wyszukać pliki nie kończące się na „.tmp”, używamy następującego wyrażenia regularnego:
Testowany za pomocą Regex Testera daje następujący wynik:
źródło
^.*(?![.]tmp$)
nie?.*
dopasowanie już pasuje do całego ciągu, więc pozostałe wykluczenie już nie działa.Wyrażenie regularne powyżej dopasuje ciągi, które nie kończą się na
a
.źródło
Spróbuj tego
[]
Oznacza klasę postaci, a^
odwraca klasa znaków dopasować wszystko, alea
.źródło
Pytanie jest stare, ale nie mogłem znaleźć lepszego rozwiązania, które zamieściłbym tutaj. Znajdź wszystkie dyski USB, ale nie wyświetlaj listy partycji , usuwając w ten sposób „część [0–9]” z wyników. Skończyłem robić dwa grep, ostatni neguje wynik:
To wyniki w moim systemie:
Jeśli chcę tylko partycje, mógłbym to zrobić:
Gdzie dostanę:
A kiedy to zrobię:
Dostaję:
źródło
Zaakceptowana odpowiedź jest w porządku, jeśli możesz użyć lookarounds. Istnieje jednak inne podejście do rozwiązania tego problemu.
Jeśli spojrzymy na szeroko proponowany regex dla tego pytania:
.*[^a]$
Przekonamy się, że to prawie działa. Nie przyjmuje pustego ciągu, co może być trochę niewygodne. Jest to jednak drobny problem w przypadku tylko jednej postaci. Jeśli jednak chcemy wykluczyć cały ciąg, np. „Abc”, to:
.*[^a][^b][^c]$
nie zrobię. Na przykład nie akceptuje ac.
Istnieje jednak proste rozwiązanie tego problemu. Możemy po prostu powiedzieć:
.{,2}$|.*[^a][^b][^c]$
lub bardziej ogólna wersja:
.{,n-1}$|.*[^firstchar][^secondchar]$
gdzie n oznacza długość łańcucha chcesz zabronić (zaabc
to 3),firstchar
,secondchar
, ... są pierwszym, drugim ... nth znaków Twojego ciąg (dlaabc
byłobya
, następnieb
, potemc
).Wynika to z prostej obserwacji, że łańcuch krótszy niż tekst, którego nie zabronimy, nie może zawierać tego tekstu z definicji. Możemy więc zaakceptować wszystko, co jest krótsze („ab” nie jest „abc”), lub wszystko, co wystarcza na tyle długo, abyśmy zaakceptowali, ale bez końca.
Oto przykład find, który usunie wszystkie pliki, które nie są .jpg:
find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete
źródło
.{,2}$|.*[^a][^b][^c]$
nie pasujeccc
Wszystko, co pasuje do czegoś, co kończy się na ---
.*a$
Więc jeśli dopasujesz wyrażenie regularne, zaneguj warunek lub alternatywnie możesz również zrobić.*[^a]$
gdzie[^a]
oznacza wszystko, co jestnot a
źródło
Jeśli używasz
grep
lubsed
składnia będzie nieco inna. Zauważ, że[^a][^b]
metoda sekwencyjna tutaj nie działa:FWIW, znajduję te same wyniki w Regex101 , co moim zdaniem jest składnią JavaScript.
Źle: https://regex101.com/r/MJGAmX/2
Dobrze: https://regex101.com/r/LzrIBu/2
źródło