Używam RegexBuddy, ale i tak mam z tym kłopoty: \
Przetwarzam wiersz po wierszu plik. Zbudowałem „model liniowy”, aby dopasować się do tego, czego chcę.
Teraz chciałbym wykonać odwrotne dopasowanie ... tj. Chcę dopasować wiersze, w których znajduje się ciąg 6 liter, ale tylko jeśli te sześć liter to nie Andrea , jak mam to zrobić?
EDYCJA: Napiszę program, który używa tego wyrażenia regularnego, jeszcze nie wiem, czy w pythonie czy php, robię to najpierw, aby nauczyć się jakiegoś wyrażenia regularnego :) Są różne typy linii, chciałem użyć wyrażenia regularnego aby wybrać typ, który mnie interesuje. Kiedy już mam te wiersze, muszę zastosować inny filtr, aby nie dopasować znanej wartości, potrzebuję wszystkich innych, a nie to. (?! Nie-poszukiwane) działa całkiem nieźle, dziękuję. :-)
Mam nadzieję, że to wyjaśnia pytanie :)
źródło
Odpowiedzi:
Zakładając, że Twój silnik regexp obsługuje ujemne wybiegania w przód.
Edycja: ... a może wolisz użyć
[A-Za-z]{6}
zamiast.{6}
Edytuj (ponownie): Zwróć uwagę, że patrzenie w przód i w tył zazwyczaj nie są właściwym sposobem „odwrócenia” dopasowania wyrażenia regularnego. Wyrażenia regularne nie są tak naprawdę skonfigurowane do przeprowadzania dopasowań negatywnych, pozostawiają to w jakimkolwiek języku, w którym ich używasz.
źródło
W przypadku Python / Java,
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
źródło
some text
rozpocznie wiersz, zwróci nieprawidłowy wynik.?!
i nie tylko!
.Zaktualizowano dzięki opiniom Alana Moore'a
W PCRE i podobnych wariantach można faktycznie utworzyć wyrażenie regularne pasujące do dowolnego wiersza niezawierającego wartości:
Nazywa się to hartowanym żetonem chciwości . Wadą jest to, że nie działa dobrze.
źródło
[\s\S]
, co jest użyteczne tylko w JavaScript) po drugim uprzedzona i nie trzeba się pierwszy:^(?:(?!Andrea).)*$
.[\S\s]
? OP mówi o pasujących liniach, które nie zawierają słowa „Andrea”. Nie chodzi o sprawdzanie, czy cały ciąg zawiera to słowo. Czy coś mi brakuje?Jakiego języka używasz? W tym przypadku znaczenie mają możliwości i składnia implementacji wyrażenia regularnego.
Możesz użyć antycypowania. Na przykładzie Pythona
Aby to przełamać:
(?! Andrea) oznacza „dopasuj, jeśli kolejnych 6 znaków nie jest„ Andrea ””; jeśli tak, to
\ w oznacza „znak słowa” - znaki alfanumeryczne. Jest to odpowiednik klasy [a-zA-Z0-9_]
\ w {6} oznacza dokładnie 6 znaków słów.
re.IGNORECASE oznacza, że wykluczysz „Andrea”, „andrea”, „ANDREA” ...
Innym sposobem jest użycie logiki programu - użyj wszystkich linii, które nie pasują do Andrei i przeprowadź je przez drugie wyrażenie regularne, aby sprawdzić 6 znaków. Lub najpierw sprawdź co najmniej 6 znaków słów, a następnie sprawdź, czy nie pasuje do Andrea.
źródło
Negatywne stwierdzenie wyprzedzania
To nie jest dokładnie odwrócone dopasowanie, ale jest to najlepsze, co można zrobić bezpośrednio za pomocą wyrażenia regularnego. Jednak nie wszystkie platformy je obsługują.
źródło
Jeśli chcesz to zrobić w RegexBuddy, istnieją dwa sposoby uzyskania listy wszystkich wierszy niepasujących do wyrażenia regularnego.
Na pasku narzędzi w panelu Test ustaw zakres testu na „Linia po linii”. Gdy to zrobisz, element Lista wszystkich wierszy bez dopasowań pojawi się pod przyciskiem Lista wszystkich na tym samym pasku narzędzi. (Jeśli nie widzisz przycisku Wyświetl wszystkie, kliknij przycisk Dopasuj na głównym pasku narzędzi).
W panelu GREP możesz zaznaczyć pola wyboru „oparte na wierszach” i „Odwróć wyniki”, aby uzyskać listę niepasujących wierszy w plikach, przez które przeglądasz.
źródło
(?!
jest przydatne w praktyce. Chociaż ściśle mówiąc, patrzenie w przyszłość nie jest wyrażeniem regularnym zdefiniowanym matematycznie.Możesz ręcznie napisać odwrócone wyrażenie regularne.
Oto program do automatycznego obliczania wyniku. Jego wynik jest generowany maszynowo, co jest zwykle znacznie bardziej złożone niż pisanie ręczne. Ale wynik działa.
źródło
Właśnie wymyśliłem tę metodę, która może wymagać dużej ilości sprzętu, ale działa:
Możesz zastąpić wszystkie znaki, które pasują do wyrażenia regularnego, pustym ciągiem.
To jest oneliner:
notMatched = re.sub(regex, "", string)
Użyłem tego, ponieważ byłem zmuszony użyć bardzo złożonego wyrażenia regularnego i nie mogłem wymyślić, jak odwrócić każdą jego część w rozsądnym czasie.
To zwróci tylko wynik w postaci łańcucha, a nie żadnych dopasowanych obiektów!
źródło
W perlu możesz to zrobić
proces ($ linia) if ($ linia = ~! / Andrea /);
źródło