Regex: se potrivește cu totul în afară de modelul specific (Programare, Regex)

pistacchio a intrebat.

Am nevoie de un regex capabil să potrivească totul dar un șir de caractere care începe cu un model specific (în special index.php și ceea ce urmează, cum ar fi index.php?id=2342343)

Comentarii

  • Și ce specific model vrei să nu se potrivească? –  > Por Dominic Rodger.
  • Există vreun motiv pentru care nu puteți să vă comparați cu modelul și să nu faceți nimic dacă șirul se potrivește cu acesta? –  > Por Thomas Owens.
  • Posibilă duplicare a expresiei regulate pentru a se potrivi cu o linie care nu conține un cuvânt? –  > Por 7vujy0f0hy.
  • @ThomasOwens: Depinde. Depinde de ce parte a expresiei trebuie să fie negată. Dacă întreaga expresie trebuie să fie negată, atunci ai dreptate. De exemplu, dacă doriți să codificați „dacă șirul nu conține ‘Bruce’ ca subșir, atunci faceți ceva”, ați folosi pur și simplu /Bruce/ și ați pune negația în declarația if, în afara regex-ului. Dar s-ar putea să doriți să negați o subexpresie. Să zicem că sunteți în căutarea a ceva de genul prenume prenume, unde prenumele este Bruce, iar prenumele este orice, cu excepția lui XYZ, unde XYZ este numele de familie al unei celebrități pe nume Bruce. –  > Por mathheadinclouds.
7 răspunsuri
Pisica Plus Plus

Nu sunt un expert în regexp, dar cred că ai putea folosi un lookahead negativ de la început, de ex. ^(?!foo).*$ nu ar trebui să se potrivească cu nimic care începe cu foo.

Comentarii

  • Cu grep folosiți -P pentru a activa lookahead. –  > Por Seppo Enarvi.
  • Dacă nu se potrivește cu „foo” sau „bar” este comportamentul dorit, verificați acest răspuns: stackoverflow.com/a/2404330/874824 –  > Por dave_k_smith.
  • 21

  • Acest răspuns este greșit, un test rapid arată că. Cred că ceea ce ați vrut să spuneți este ^((?!foo).)*$ (stackoverflow.com/a/406408/3964381) –  > Por gilad mayani.
  • Vă rog să explicați simbolurile pe care le-ați folosit și de ce le-ați folosit? –  > Por rotimi-best.
  • Cred că vrei să spui, un regexpert 🙂 –  > Por leetbacoon.
Wiktor Stribiżew

Regex: potrivește totul dar:

Notă demonstrativă: linia nouă
este utilizat în interiorul claselor de caractere negate în demonstrații pentru a evita depășirea corespondenței la linia (liniile) învecinată (e). Acestea nu sunt necesare atunci când se testează șiruri individuale.

Notă de ancorare: În multe limbi, se utilizează A pentru a defini începutul neechivoc al șirului, iar z (în Python, este Z, , în JavaScript, $ este OK) pentru a defini sfârșitul propriu-zis al șirului.

Nota punctului: În multe arome (dar nu și în POSIX, TRE, TCL), . se potrivește cu orice caracter în afară de o linie nouă char. Asigurați-vă că utilizați un modificator DOTALL corespunzător (/s în PCRE/Boost/.NET/Python/Java și /m în Ruby) pentru . pentru a se potrivi cu orice caracter, inclusiv o linie nouă.

Notă privind bara inversă: În limbajele în care trebuie să declarați modele cu șiruri C care permit secvențe de scăpare (cum ar fi
pentru o linie nouă), trebuie să dublați backslash-urile care scapă de caracterele speciale, astfel încât motorul să le poată trata ca pe niște caractere literale (de exemplu, în Java, world. va fi declarat ca "world\.", , sau folosiți o clasă de caractere: "world[.]"). Utilizați caractere literale de șiruri de caractere brute (Python r'bworldb'), literali de șir de caractere verbatim în C# @"world.", , sau notații literale de șiruri/regex de tip slashy, cum ar fi /world./.

Comentarii

  • Bună scriere! Pentru cazul „un șir de caractere (nu) egal cu un anumit șir de caractere”, cu exemplul de ^(?!foo$), , de ce trebuie ca semnul dolarului să fie între paranteze pentru ca expresia să funcționeze? Mă așteptam ca ^(?!foo)$ să dea aceleași rezultate, dar nu este așa. –  > Por Grant Humphries.
  • @GrantHumphries: Atunci când $ ancoră se află în interiorul lookahead-ului, face parte din condiție, din acel aserțiune de lățime zero. Dacă ar fi în afara, ca în ^(?!foo)$, , va face parte din consumatoare care necesită sfârșitul șirului imediat după începutul șirului, ceea ce face ca lookahead-ul negativ să fie irelevant, deoarece ar returna întotdeauna adevărat (nu poate exista niciun text după sfârșitul șirului, cu atât mai puțin foo). Așadar, ^(?!foo$) se potrivește cu începutul unui șir de caractere care nu este urmat de foo care este urmat de șirul end. ^(?!foo)$ se potrivește cu un șir gol. –  > Por Wiktor Stribiżew.
  • @robots.txt Vă rugăm să eliminați aceste comentarii. Puneți o întrebare XY. Clasele de caractere sunt menite să se potrivească cu caractere unice, nu există nicio modalitate de a defini o secvență de caractere cu ele. Probabil că ar trebui să găsiți doar subșirul dintre începutul unui șir și prima apariție a lui cot sau lan, și să eliminați corespondența, cum ar fi regex.replace(myString, "^.*?(?:cot|lan)s*", ""). –  > Por Wiktor Stribiżew.
  • Dragă Wiktor. Ați închis întrebarea mea, însă răspunsul dvs. legat nu reușește. Am actualizat întrebarea mea stackoverflow.com/questions/60004380/… –  > Por MonsterMMORPG.
  • @Dotizo Python re este destul de diferită de PCRE. Utilizați PyPi regex library care suportă (*SKIP)(*FAIL) verbele. –  > Por Wiktor Stribiżew.
Firsh – justifiedgrid.com

Se poate pune o ^ la începutul unui set de caractere pentru a se potrivi cu orice altceva în afară de acele caractere.

[^=]*

se va potrivi cu orice în afară de =

Comentarii

    61

  • Este adevărat, dar procesează doar un singur caracter la un moment dat. Dacă doriți să excludeți o secvență de două sau mai multe caractere, trebuie să folosiți un lookahead negativ, așa cum au spus și ceilalți respondenți. –  > Por Alan Moore.
  • soluție perfectă pentru a elimina orice caracter nedorit dar decât cele din tipar. mulțumesc.  > Por Sirmyself.
  • @Alan, „…trebuie să folosești un lookahead negativ…” este incorect, dar nu ar trebui să fim prea duri cu tine pentru că Wiktor nu a postat răspunsul său – care arată de ce – până în 2016. –  > Por Cary Swoveland.
user181548

Doar potriviți /^index.php/ apoi respingeți tot ce se potrivește.

Comentarii

  • Poate scris str !~ /Aindex.php/. –  > Por Cary Swoveland.
AJ.

În python:

>>> import re
>>> p='^(?!index.php?[0-9]+).*$'
>>> s1='index.php?12345'
>>> re.match(p,s1)
>>> s2='index.html?12345'
>>> re.match(p,s2)
<_sre.SRE_Match object at 0xb7d65fa8>

Comentarii

  • Asta va respinge „index_php” sau „index#php”. – user181548
Юрий Светлов

Am nevoie de un regex capabil să să se potrivească cu orice dar cu excepția a șir care începe cu index.php un model specific (în special index.php și ceea ce urmează, cum ar fi index.php?id=2342343)

Utilizați metoda Execută

SAU O ALTĂ MECIALIZARE

Percutio

Ce-ar fi să nu folosiți regex:

// In PHP
0 !== strpos($string, 'index.php')

Comentarii

  • OP a cerut în mod specific un regex… Nu sunt sigur că asta ajută! (Este posibil ca el să folosească grep pe linia de comandă, de exemplu, sau Perl/Python/ orice alt limbaj, sau o comandă „Execută acest regex pentru fiecare linie” într-un editor de text, etc…)  > Por rinogo.

Tags: