Potrzebuję wyrażenia regularnego zdolnego do dopasowania wszystkiego oprócz łańcucha rozpoczynającego się od określonego wzorca (konkretnie index.phpi tego, co następuje, jak index.php?id=2342343)
@ThomasOwens: To zależy. To zależy od tego, która część wyrażenia będzie zanegowana. Jeśli całe wyrażenie ma być zanegowane, masz rację. Na przykład, jeśli chcesz zakodować „jeśli ciąg nie zawiera„ Bruce ”jako podłańcucha, zrób coś”, użyjesz po prostu / Bruce / i umieścisz negację w instrukcji if, poza wyrażeniem regularnym . Ale może być tak, że chciałbyś zanegować niektóre podwyrażenia. Powiedzmy, że szukasz czegoś takiego jak imię, gdzie imię to Bruce, a nazwisko to wszystko oprócz XYZ, gdzie XYZ to nazwisko niektórych celebrytów o imieniu Bruce.
mathheadinclouds
Odpowiedzi:
250
Nie jestem ekspertem od wyrażeń regularnych, ale myślę, że od samego początku możesz użyć negatywnego spojrzenia, np. ^(?!foo).*$Nie powinieneś pasować do niczego, zaczynając od foo.
Inne silniki pozwalające na szukanie: (cat)|[^c]*(?:c(?!at)[^c]*)*(lub (?s)(cat)|(?:(?!cat).)*, lub (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*), a następnie sprawdzanie językowe oznacza: jeśli grupa 1 jest dopasowana, nie jest nam potrzebna, w przeciwnym razie, pobierz wartość dopasowania, jeśli nie jest pusta
Uwaga demonstracyjna : nowa linia \njest używana w negowanych klasach znaków w demonstracjach, aby uniknąć przepełnienia dopasowania do sąsiednich linii. Nie są one konieczne podczas testowania pojedynczych ciągów.
Uwaga kotwicy : W wielu językach użyj \Ado zdefiniowania jednoznacznego początku łańcucha, a \z(w Pythonie jest to \Zw JavaScript $jest OK), aby zdefiniować sam koniec łańcucha.
Uwaga dot : W wielu smakach (ale nie POSIX, TRE, TCL), .pasuje do dowolnego znaku, ale znak nowego wiersza . Upewnij się, że używasz odpowiedniego modyfikatora DOTALL ( /sw PCRE / Boost / .NET / Python / Java i /mRuby), .aby dopasować dowolny znak, w tym nowy wiersz.
Backslash Uwaga : W językach, gdzie trzeba zadeklarować wzory z ciągów C pozwalających sekwencje (jak \ndla nowej linii), trzeba podwoić backslashy uciekających tak specjalne znaki, że silnik mógłby traktować je jako znaki dosłowne (na przykład w Javie, world\.będzie zadeklarowane jako "world\\."lub użyj klasy znaków:) "world[.]". Używaj nieprzetworzonych literałów łańcuchowych (Python r'\bworld\b'), dosłownych literałów łańcuchowych C # @"world\."lub ukośnych ciągów znaków / wyrażeń regularnych, takich jak /world\./.
Świetnie napisz! W przypadku „łańcucha (nie) równego jakiemuś łańcuchowi”, na przykład ^(?!foo$), dlaczego znak dolara musi znajdować się w nawiasach, aby wyrażenie działało? Spodziewałem ^(?!foo)$się dać te same wyniki, ale tak nie jest.
Grant Humphries,
3
@GrantHumphries: Gdy $kotwica znajduje się wewnątrz anteny, jest to część warunku, część tego stwierdzenia o zerowej szerokości . Gdyby znajdował się na zewnątrz, jak w ^(?!foo)$, będzie częścią wzorca konsumpcji wymagającego końca łańcucha zaraz po rozpoczęciu łańcucha, co sprawi, że negatywne spojrzenie w przód nie będzie miało znaczenia, ponieważ zawsze zwróci prawdę (nie może być tekstu po końcu łańcucha , nie mówiąc już foo). Tak więc ^(?!foo$)dopasowuje początek łańcucha, który nie jest śledzony foo, po którym następuje koniec łańcucha. ^(?!foo)$dopasowuje pusty ciąg.
Wiktor Stribiżew
@ robots.txt Usuń te komentarze. Zadajesz pytanie XY. Klasy postaci mają pasować do pojedynczych znaków, nie ma możliwości zdefiniowania z nimi sekwencji znaków. Prawdopodobnie powinieneś po prostu znaleźć podciąg między początkiem łańcucha a pierwszym wystąpieniem cotlub lani usunąć dopasowanie, jak regex.replace(myString, "^.*?(?:cot|lan)\s*", "").
Wiktor Stribiżew
Drogi Wiktorze. Zamknąłeś moje pytanie, jednak Twoja linkowana odpowiedź nie udaje się. Zaktualizowałem moje pytanie stackoverflow.com/questions/60004380/…
MonsterMMORPG
Na przykład linkowana odpowiedź kończy się niepowodzeniem w tym przykładzie „ing pakiety <! - i strona internetowa <! - asdasasdas -> teraz używają edytorzy -> Lorem Ipsum”
MonsterMMORPG
259
Możesz umieścić a ^na początku zestawu znaków, aby dopasować wszystko oprócz tych znaków.
To prawda, ale przetwarza tylko jedną postać na raz. Jeśli chcesz wykluczyć sekwencję dwóch lub więcej znaków, musisz użyć negatywnego spojrzenia w przód, tak jak mówili inni respondenci.
Alan Moore,
idealne rozwiązanie, aby usunąć wszelkie niepożądane postacie oprócz tych we wzorze. dzięki
Sirmyself
@Alan, „... musisz użyć negatywnego spojrzenia w przyszłość ...” jest niepoprawny, ale nie powinniśmy być dla ciebie zbyt surowi, ponieważ Wiktor nie opublikował swojej odpowiedzi - co pokazuje dlaczego - do 2016 r.
Cary Swoveland,
6
Po prostu dopasuj, /^index\.php/a następnie odrzuć wszystko, co pasuje.
Potrzebuję regex stanie dopasować wszystko, ale except się ciąg rozpoczynający się odindex.php określonego wzoru (konkretnie index.php a co za tym idzie, jak index.php? Id = 2342343)
OP specjalnie poprosił o wyrażenie regularne ... Nie jestem pewien, czy to pomaga! (Może używać np. grepW wierszu poleceń, Perl / Python / w dowolnym innym języku lub w poleceniu „Wykonaj wyrażenie regularne dla każdej linii” w edytorze tekstów itp.)
Odpowiedzi:
Nie jestem ekspertem od wyrażeń regularnych, ale myślę, że od samego początku możesz użyć negatywnego spojrzenia, np.
^(?!foo).*$
Nie powinieneś pasować do niczego, zaczynając odfoo
.źródło
^((?!foo).)*$
( stackoverflow.com/a/406408/3964381 )Regex: dopasuj wszystko oprócz :
foo
):^(?!foo).*$
^(?!foo)
^(([^f].{2}|.[^o].|.{2}[^o]).*|.{0,2})$
^([^f].{2}|.[^o].|.{2}[^o])|^.{0,2}$
world.
na końcu):(?<!world\.)$
^.*(?<!world\.)$
^(.*([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.])|.{0,5})$
([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.]$|^.{0,5})$
foo
) (brak patern zgodnych z POSIX, przepraszam):^(?!.*foo)
^(?!.*foo).*$
|
symbol):^[^|]*$
foo
):^(?!foo$)
^(?!foo$).*$
^(.{0,2}|.{4,}|[^f]..|.[^o].|..[^o])$
cat
):/cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i
lub/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
(cat)|[^c]*(?:c(?!at)[^c]*)*
(lub(?s)(cat)|(?:(?!cat).)*
, lub(cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*
), a następnie sprawdzanie językowe oznacza: jeśli grupa 1 jest dopasowana, nie jest nam potrzebna, w przeciwnym razie, pobierz wartość dopasowania, jeśli nie jest pusta[^a-z]+
(dowolny znak inny niż mała litera ASCII)|
:[^|]+
Uwaga demonstracyjna : nowa linia
\n
jest używana w negowanych klasach znaków w demonstracjach, aby uniknąć przepełnienia dopasowania do sąsiednich linii. Nie są one konieczne podczas testowania pojedynczych ciągów.Uwaga kotwicy : W wielu językach użyj
\A
do zdefiniowania jednoznacznego początku łańcucha, a\z
(w Pythonie jest to\Z
w JavaScript$
jest OK), aby zdefiniować sam koniec łańcucha.Uwaga dot : W wielu smakach (ale nie POSIX, TRE, TCL),
.
pasuje do dowolnego znaku, ale znak nowego wiersza . Upewnij się, że używasz odpowiedniego modyfikatora DOTALL (/s
w PCRE / Boost / .NET / Python / Java i/m
Ruby),.
aby dopasować dowolny znak, w tym nowy wiersz.Backslash Uwaga : W językach, gdzie trzeba zadeklarować wzory z ciągów C pozwalających sekwencje (jak
\n
dla nowej linii), trzeba podwoić backslashy uciekających tak specjalne znaki, że silnik mógłby traktować je jako znaki dosłowne (na przykład w Javie,world\.
będzie zadeklarowane jako"world\\."
lub użyj klasy znaków:)"world[.]"
. Używaj nieprzetworzonych literałów łańcuchowych (Pythonr'\bworld\b'
), dosłownych literałów łańcuchowych C #@"world\."
lub ukośnych ciągów znaków / wyrażeń regularnych, takich jak/world\./
.źródło
^(?!foo$)
, dlaczego znak dolara musi znajdować się w nawiasach, aby wyrażenie działało? Spodziewałem^(?!foo)$
się dać te same wyniki, ale tak nie jest.$
kotwica znajduje się wewnątrz anteny, jest to część warunku, część tego stwierdzenia o zerowej szerokości . Gdyby znajdował się na zewnątrz, jak w^(?!foo)$
, będzie częścią wzorca konsumpcji wymagającego końca łańcucha zaraz po rozpoczęciu łańcucha, co sprawi, że negatywne spojrzenie w przód nie będzie miało znaczenia, ponieważ zawsze zwróci prawdę (nie może być tekstu po końcu łańcucha , nie mówiąc jużfoo
). Tak więc^(?!foo$)
dopasowuje początek łańcucha, który nie jest śledzonyfoo
, po którym następuje koniec łańcucha.^(?!foo)$
dopasowuje pusty ciąg.cot
lublan
i usunąć dopasowanie, jakregex.replace(myString, "^.*?(?:cot|lan)\s*", "")
.Możesz umieścić a
^
na początku zestawu znaków, aby dopasować wszystko oprócz tych znaków.dopasuje wszystko oprócz
=
źródło
Po prostu dopasuj,
/^index\.php/
a następnie odrzuć wszystko, co pasuje.źródło
str !~ /\Aindex\.php/
.W python:
źródło
Użyj metody Exec
LUB INNE MECZE
źródło
Może nie użyjesz wyrażenia regularnego:
źródło
grep
W wierszu poleceń, Perl / Python / w dowolnym innym języku lub w poleceniu „Wykonaj wyrażenie regularne dla każdej linii” w edytorze tekstów itp.)