Pagina principala » HOWTO » Cum să utilizați expresii regulate de bază pentru a căuta mai bine și a economisi timp

    Cum să utilizați expresii regulate de bază pentru a căuta mai bine și a economisi timp

    Fie că ați căutat cu Grep, fie că vă uitați la programe care vă pot redenumi fișierele, ați întrebat probabil dacă a existat o cale mai ușoară de a vă face treaba. Din fericire, există, și se numește "expresii regulate".

    (Comic de la XKCD.com)

    Ce sunt Expresiile regulate??

    Expresiile regulate sunt declarații formatate într-un mod foarte specific și care pot rezista la multe rezultate diferite. De asemenea, cunoscute sub numele de "regex" sau "regexp", ele sunt utilizate în principal în funcțiile de căutare și de numire a fișierelor. Un regex poate fi folosit ca o formulă pentru a crea un număr de diferite ieșiri posibile, toate fiind căutate. Alternativ, puteți specifica modul în care un grup de fișiere trebuie denumit specificând un regex, iar software-ul dvs. poate trece treptat la următoarea ieșire dorită. În acest fel, puteți redenumi foarte multe fișiere în mai multe foldere foarte ușor și eficient și puteți trece dincolo de limitele unui sistem simplu de numerotare.

    Deoarece utilizarea expresiilor regulate se bazează pe o sintaxă specială, programul dvs. trebuie să fie capabil să le citească și să le parseze. Multe programe de redenumire a fișierelor batch pentru Windows și OS X au suport pentru regexps, precum și instrumentul de căutare cross-platform GREP (la care ne-am referit în Bash Scripting for Beginners Guide) și instrumentul de linie de comandă Awk pentru * Nix. În plus, mulți manageri de fișiere alternative, lansatoare și instrumente de căutare le utilizează și au un loc foarte important în limbile de programare precum Perl și Ruby. Alte medii de dezvoltare precum .NET, Java și Python, precum și viitoarea C ++ 11, toate oferă biblioteci standard pentru utilizarea expresiilor regulate. După cum vă puteți imagina, ele pot fi foarte utile atunci când încercați să minimalizați cantitatea de cod pe care o introduceți într-un program.

    O notă despre caracterele escape

    Înainte de a vă arăta exemple, ne-ar plăcea să arătăm ceva. Vom folosi shell-ul bash și comanda grep pentru a vă arăta cum să aplicați expresii regulate. Problema este că, uneori, vrem să folosim caractere speciale care trebuie să fie transmise la grep, iar shell-ul bash va interpreta acel caracter, deoarece shell-ul o folosește și ea. În aceste condiții, trebuie să "scăpăm" aceste personaje. Acest lucru poate deveni confuz, deoarece această "scăpare" a personajelor apare și în interiorul regexps-urilor. De exemplu, dacă vrem să introducem acest lucru în grep:

    \<

    va trebui să o înlocuim cu:

    \\\<

    Fiecare personaj special are un backslash. Alternativ, puteți utiliza, de asemenea, citate simple:

    „\<'

    Citate unice spun bash NU să interpreteze ceea ce este în interiorul lor. În timp ce solicităm ca acești pași să fie luați, astfel încât să putem demonstra pentru dvs., programele dvs. (în special cele bazate pe GUI) nu vor necesita adesea acești pași suplimentari. Pentru a păstra lucrurile simple și clare, expresia regulată reală vă va fi oferită ca text citat și veți vedea sintaxa evitată în capturile de ecran ale liniei de comandă.

    Cum se extind?

    Regexps-urile sunt un mod foarte concis de a stabili termeni, astfel încât calculatorul să le poată extinde în mai multe opțiuni. Să aruncăm o privire la următorul exemplu:

    tom [0123456789]

    Parantezele pătrate - [și] - spun motorului de parsing că orice este înăuntru, orice caracter ONE poate fi folosit pentru a se potrivi. Orice este în interiorul acestor paranteze este numit set de caractere.

    Deci, dacă am avea o listă uriașă de intrări și am folosit acest regex pentru a căuta, următorii termeni s-ar potrivi:

    • tom
    • tom0
    • tom1
    • tom2
    • tom3

    si asa mai departe. Cu toate acestea, următoarea listă NU ar fi potrivită și astfel NU ar apărea în rezultatele dvs.:

    • roșie ; regexul nu ia în considerare nici o literă după "tom"
    • Tom; regexul este sensibil la minuscule!

    De asemenea, puteți să căutați cu o perioadă (.) Care să permită orice caracter prezent, atât timp cât există un caracter prezent.

    Așa cum puteți vedea, cu greu

    .tom

    nu a adus termeni care au avut doar "tom" la început. Chiar și "roșii verzi" au intrat, pentru că spațiul înaintea "tom" contează ca un personaj, dar termeni precum "tomF" nu au avut un caracter la început și au fost astfel ignorați.

    Notă: comportamentul implicit al lui Grep este de a returna o întreagă linie de text atunci când o parte se potrivește cu regex. Este posibil ca alte programe să nu facă acest lucru și puteți dezactiva acest lucru în grep cu pavilionul "-o".

    De asemenea, puteți specifica alternanța folosind o conductă (|), ca aici:

    speciali (s | z) e

    Acestea vor găsi atât:

    • specializa
    • specializa

    Când folosim comanda grep, trebuie să scăpăm de caracterele speciale (, |, și) cu backslashes, precum și să folosim steagul "-E" pentru a face acest lucru la lucru și pentru a evita erorile urâte.

    Așa cum am menționat mai sus, acest lucru se datorează faptului că trebuie să-i spunem coajă de bash să treacă aceste personaje în grep și să nu facă nimic cu ei. Steagul "-E" spune grep că va folosi parantezele și țevile ca caractere speciale.

    Puteți căuta prin excludere utilizând o cartelă care este atât în ​​interiorul parantezelor dvs. pătrate, cât și la începutul unui set:

    Tom [^ F | 0-9]

    Din nou, dacă utilizați grep și bash, amintiți-vă să scăpați de acea conductă!

    Termenii care au fost în listă dar NU s-au afișat sunt:

    • tom0
    • tom5
    • tom9
    • tomF

    Acestea nu s-au potrivit cu regexul nostru.

    Cum pot utiliza medii?

    Adesea, căutăm pe baza limitelor. Uneori, dorim doar șiruri de caractere care apar la începutul unui cuvânt, la sfârșitul unui cuvânt sau la sfârșitul unei linii de cod. Acest lucru se poate face cu ușurință folosind ceea ce numim ancore.

    Folosind o cartelă (în afara parantezelor) vă permite să desemnați "începutul" unei linii.

    ^ tom

    Pentru a căuta sfârșitul unei linii, utilizați semnul dolarului.

    Tom $

    Puteți vedea că șirul de căutare vine înainte de ancora în acest caz.

    Puteți, de asemenea, pentru potrivirile care apar la începutul sau la sfârșitul cuvintelor, nu la linii întregi.

    \

    Tom \>

    Așa cum am menționat în nota de la începutul acestui articol, trebuie să scăpăm de aceste personaje speciale deoarece folosim bash. Alternativ, puteți utiliza, de asemenea, citate simple:

    Rezultatele sunt aceleași. Asigurați-vă că folosiți citate simple și nu ghilimele duble.

    Alte resurse pentru regexpii avansați

    Am lovit doar vârful aisbergului aici. De asemenea, puteți căuta termenii de bani delimitați de marcatorul de valută și căutați oricare dintre trei sau mai mulți termeni de potrivire. Lucrurile pot deveni cu adevărat complicate. Dacă sunteți interesat să aflați mai multe despre expresiile regulate, vă rugăm să aruncați o privire la următoarele surse.

    • Zytrax.com are câteva pagini cu exemple specifice de ce lucrurile se potrivesc și nu se potrivesc.
    • Regular-Expressions.info are, de asemenea, un ghid de criminal pentru o mulțime de lucruri mai avansate, precum și o pagină de referință la îndemână.
    • Gnu.org are o pagină dedicată utilizării regexps-ului cu grep.

    Puteți, de asemenea, să vă construiți și să testați expresiile obișnuite folosind un instrument online gratuit bazat pe Flash, numit RegExr. Funcționează în timp ce tastați, este gratuit și poate fi utilizat în majoritatea browserelor.


    Aveți o utilizare preferată pentru expresii regulate? Cunoașteți un renumăr mare de loturi care le folosește? Poate vrei doar să te lași în brațe cu grep-fu. Contribuiți-vă gândurile comentând!