Hjemmeside » hvordan » Slik bruker du vanlige vanlige uttrykk for å søke bedre og spare tid

    Slik bruker du vanlige vanlige uttrykk for å søke bedre og spare tid

    Enten du har søkt med Grep eller ser på programmer som kan batch omdøpe filer for deg, har du sikkert lurt på om det var en enklere måte å få jobben din til. Heldigvis er det, og det kalles "regulære uttrykk."

    (Tegneserie fra XKCD.com)

    Hva er vanlige uttrykk?

    Regelmessige uttrykk er uttalelser formatert på en svært spesifikk måte, og som kan stå for mange forskjellige resultater. Også kjent som "regex" eller "regexp", brukes de hovedsakelig i søk og fil navngivelse funksjoner. En regex kan brukes som en formel for å lage en rekke forskjellige mulige utganger, som alle er søkt etter. Alternativt kan du angi hvordan en gruppe filer skal navngis ved å spesifisere en regex, og programvaren kan trinnvis flytte til neste tilsiktede utgang. På denne måten kan du omdøpe flere filer i flere mapper veldig enkelt og effektivt, og du kan bevege deg utover begrensningene i et enkelt nummereringssystem.

    Fordi bruken av vanlige uttrykk er avhengig av et spesielt syntaks, må programmet være i stand til å lese og analysere dem. Mange batchfilenavnsprogrammer for Windows og OS X har støtte for regexps, samt krypteringsverktøyet GREP (som vi berørte i vår Bash Scripting for Beginners Guide) og Awk kommandolinjeverktøyet for * Nix. I tillegg bruker mange alternative filbehandlere, lansere og søkeverktøy dem, og de har et svært viktig sted i programmeringsspråk som Perl og Ruby. Andre utviklingsmiljøer som .NET, Java og Python, samt den kommende C ++ 11, gir alle standardbiblioteker for bruk av vanlige uttrykk. Som du kan forestille deg, kan de være veldig nyttige når du prøver å minimere mengden kode du legger inn i et program.

    En kommentar om flykte tegn

    Før vi viser deg eksempler, vil vi gjerne vise noe ut. Vi skal bruke bash-skallet og grep-kommandoen for å vise deg hvordan du bruker vanlige uttrykk. Problemet er at noen ganger vil vi bruke spesialtegn som må sendes til grep, og bash-skallet vil tolke den karakteren fordi skallet også bruker det. Under slike omstendigheter må vi "unnslippe" disse tegnene. Dette kan bli forvirrende fordi dette "escaping" av tegn også forekommer i regexps. For eksempel, hvis vi vil legge inn dette i grep:

    \<

    vi må erstatte det med:

    \\\<

    Hver spesiell karakter her får en tilbakeslag. Alternativt kan du også bruke enkle anførselstegn:

    '\<'

    Enkle sitater forteller bash IKKE å tolke hva som er innsiden av dem. Mens vi krever at disse trinnene skal tas slik at vi kan demonstrere for deg, vil dine programmer (spesielt GUI-baserte) ofte ikke kreve disse ekstra trinnene. For å holde ting enkelt og greit, vil det faktiske vanlige uttrykket bli gitt til deg som sitert tekst, og du vil se den rømte syntaksen i kommandolinjens skjermbilder.

    Hvordan utvider de?

    Regexps er en veldig kortfattet måte å angi vilkår slik at datamaskinen din kan utvide dem til flere alternativer. La oss ta en titt på følgende eksempel:

    Tom [0123456789]

    Torget parentes - [og] - fortell parsing motoren at det som er inni, kan et hvilket som helst tegn brukes til å matche. Uansett hva som er inne i disse parentesene kalles et tegnsett.

    Så, hvis vi hadde en stor liste over oppføringer, og vi brukte denne regexen til å søke, ville følgende ordene bli matchet:

    • tom
    • tom0
    • tom1
    • TOM2
    • tom3

    og så videre. Imidlertid vil følgende liste IKKE bli matchet, og det vil IKKE vises i resultatene dine:

    • tomat; regex tar ikke hensyn til noen bokstaver etter "tom"
    • Tom; regex er saksfølsom!

    Du kan også velge å søke etter en periode (.) Som vil tillate noen tegn tilstede, så lenge det foreligger en tegneserie.

    Som du kan se, grepp med

    .tom

    oppsto ikke vilkår som bare hadde "tom" i begynnelsen. Selv "grønne tomater" kom inn, fordi plassen før "tom" teller som et tegn, men begreper som "tomF" hadde ikke et tegn i begynnelsen og ble dermed ignorert.

    Merk: Greps standardoppførsel er å returnere en hel tekstlinje når noen deler samsvarer med regex. Andre programmer kan ikke gjøre dette, og du kan slå av dette i grep med '-o' flagget.

    Du kan også spesifisere veksling ved hjelp av et rør (|), som her:

    speciali (r | z) e

    Dette vil finne både:

    • spesialister
    • spesialister

    Når du bruker grep-kommandoen, må vi unnslippe spesialtegnene (, |, og) med tilbakekoblinger, samt bruke '-E' -flagget for å få dette til å fungere og unngå gale feil.

    Som vi nevnte ovenfor, skyldes dette at vi må fortelle bash-skallet å passere disse tegnene til grep og ikke å gjøre noe med dem. '-E' flagget forteller grep å bruke parentesene og røret som spesialtegn.

    Du kan søke ved utelukkelse ved hjelp av en hylle som er både inne i dine firkantede parenteser og i begynnelsen av et sett:

    tom [^ F | 0-9]

    Igjen, hvis du bruker grep og bash, husk å unnslippe det røret!

    Vilkår som var i listen, men ikke vises:

    • tom0
    • tom5
    • tom9
    • tomF

    Disse stemte ikke overens med vår regex.

    Hvordan kan jeg utnytte miljøer?

    Ofte søker vi etter grenser. Noen ganger vil vi bare ha strenger som vises i begynnelsen av et ord, på slutten av et ord, eller på slutten av en linje med kode. Dette kan enkelt gjøres ved hjelp av det vi kaller ankre.

    Ved hjelp av en hylle (uten parentes) kan du angi "begynnelsen" på en linje.

    ^ tom

    For å søke etter slutten av en linje, bruk dollartegnet.

    tom $

    Du kan se at søkestrengen kommer FØR ankeret i dette tilfellet.

    Du kan også for kamper som vises i begynnelsen eller slutten av ordene, ikke hele linjene.

    \

    tom \>

    Som vi nevnte i notatet i begynnelsen av denne artikkelen, må vi unnslippe disse spesialtegnene fordi vi bruker bash. Alternativt kan du også bruke enkle anførselstegn:

    Resultatene er de samme. Pass på at du bruker enkle anførselstegn, og ikke dobbel anførselstegn.

    Andre ressurser for avanserte regexps

    Vi har bare truffet toppen av isfjellet her. Du kan også søke etter pengevilkår avgrenset av valutamarkøren, og søk etter tre eller flere matchende vilkår. Ting kan bli veldig komplisert. Hvis du er interessert i å lære mer om vanlige uttrykk, kan du ta en titt på følgende kilder.

    • Zytrax.com har noen sider med spesifikke eksempler på hvorfor ting gjør og ikke samsvarer.
    • Regular-Expressions.info har også en killer guide til mange av de mer avanserte ting, samt en praktisk referanseside.
    • Gnu.org har en side dedikert til å bruke regexps med grep.

    Du kan også bygge og teste dine vanlige uttrykk ved hjelp av et gratis Flash-basert onlineverktøy kalt RegExr. Det fungerer når du skriver, er gratis, og kan brukes i de fleste nettlesere.


    Har du en favorittbruk for vanlige uttrykk? Vet om en flott batch renamer som bruker dem? Kanskje du bare vil skryte av grep-fu. Bidra med dine tanker ved å kommentere!