If-Koubou

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

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

Fie că ați căutat cu Grep, fie că vă uitați la programe care vă pot redenumi loturi pentru fișiere, probabil că ați întrebat dacă a existat o modalitate 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 pentru începători) și instrumentul 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 cu adevărat utile atunci când încercați să minimalizați cantitatea de cod introdusă într-un program.

O notă despre caracterele escape

Înainte de a vă arăta exemple, dorim 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 transmise grepului, 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" de caractere 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 și citate simple:

'\<'

Citate singulare 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 simple, expresia obișnuită va fi dată ca text citat și veți vedea sintaxa evadată în capturile de ecran ale liniei de comandă.

Cum se extinde?

Regexps-urile reprezintă o modalitate extrem de concisă de a preciza termenii, 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 interior, orice caracter ONE poate fi folosit pentru a se potrivi. Orice este în interiorul acestor paranteze este numit un 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.

După cum vedeți, se întâmplă cu el

.tom

nu a adus termeni care să aibă doar "tom" la început. Chiar și "roșii verzi" au intrat, pentru că spațiul din fața "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 regexul. 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 țeavă (|), 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 backslash-uri, precum și să folosim pavilionul "-E" pentru a face lucrul acesta și pentru a evita erorile urâte.

Așa cum am menționat mai sus, acest lucru se datorează faptului că trebuie să le 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 se află atât în ​​parantezele 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 au apărut 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 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 ancoră î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 și 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 valutar ș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ă vă 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 folosit în majoritatea browserelor.

Aveți o utilizare preferată pentru expresii regulate? Cunoașteți un mare renume de lot care le folosește? Poate vrei doar să te lași să te odihnești de grep-fu. Contribuiți-vă gândurile comentând!