Sieppausryhmät, ennakko- ja jälkiseuranta tarjoavat tehokkaan tavan suodattaa ja hakea tietoja kehittyneen säännöllisten lausekkeiden täsmäytyslogiikan mukaisesti. Tässä artikkelissa selitetään kaappausryhmät, etänäkymät ja jälkiseuranta sekä perussyntaksi, joka sinun on tiedettävä niiden kirjoittamiseen.
Tämä on neljäs artikkeli säännöllisiä lausekkeita käsittelevästä sarjasta:
- Osa 1:Aloittelijan opas säännöllisiin lausekkeisiin grepillä
- Osa 2:Regex-ohjeet: kvantisoijat, kuviokokoelmat ja sanarajat
- Osa 3:Suodata HTML-sisältöä grep-säännöllisten lausekkeiden avulla
Näissä artikkeleissa opit tavallisista merkeistä, metamerkeistä, kvantoreista, kuviokokoelmista ja sanaryhmistä. Tämä artikkeli perustuu näihin käsitteisiin. Kuten sarjan aiemmissa artikkeleissa, tässä mallikomennot suorittavat säännöllisiä lausekkeita yhdistämällä merkkijonon tulosteenkaiku
komentogrep
apuohjelma. Thegrep
apuohjelma käyttää säännöllistä lauseketta sisällön suodattamiseen. Säännöllisten lausekkeiden esittelyn edutgrep
että sinun ei tarvitse määrittää mitään erityistä ohjelmointiympäristöä. Voit suorittaa esimerkin välittömästi kopioimalla ja liittämällä koodin suoraan tietokoneesi alla olevaan pääteikkunaanLinux.
Kaappaa ryhmät
Asieppausryhmä,Kuten nimestä voi päätellä, on säännöllinen lauseke, joka vastaa ja palauttaa merkkiryhmiä kaavan mukaan. Sieppausryhmän säännöllinen lausekelogiikka kirjoitetaan avaavien ja sulkevien sulkeiden väliin. Esimerkiksi:
(...)
Tämä sieppausryhmä edustaa seuraavaa logiikkaa:Yhdistä mitä tahansa merkkijonon merkkejä ja palauta osumat kolmen merkin ryhmissä. (Muista metahahmo.
tarkoittaamikä tahansa hahmo.) Tarkastellaan seuraavaa komentosarjaa, joka on ankaiku
komento, joka ohjaa merkkijonon a:hangrep
komento, joka suorittaa säännöllisen lausekkeen:
$ echo "abcdef" | grep -Po '(...)'
Yllä näkyvät komennot palauttavat seuraavan tuloksen:
A B C D E F
Seuraava säännöllinen lauseke palauttaa sieppausryhmät, joissa jokainen ryhmä koostuu kolmesta numeerisesta merkistä. Säännöllinen lauseke käyttää\d
metamerkit, jotka osoittavatmikä tahansa numeerinen numero:
(\DDD)
Jälleen syötämme merkkijonongrep
joka suorittaa säännöllisen lausekkeen seuraavasti:
$ echo "Puhelinnumeroni on 212 271 0897" | grep -Po '(\d\d\d)'
Komento palauttaa seuraavan tulosteen:
212271089
Seuraava sieppausryhmä vastaa ja ryhmittelee yhteen mitä tahansa 12 merkkiä tekstijonossa. Tässä tapauksessa teksti on HTML-koodinpätkä, joka toistuu seuraavasti:
$ echo "John Lennon ja Mick Jagger" |grep -Po '(...........)'
Säännöllinen lauseke palauttaa seuraavan tulosteen:
John Lennon ja Mick Jagger
Seuraava esimerkki vastaa ja ryhmittelee mitä tahansa 11 säännöllistä merkkiä, jotka esiintyvät HTML-joukon välillätunnisteet kaikuvassa merkkijonossa.
$ echo "John Lennon ja Mick Jagger" |grep -Po '(........... )'
Lähtö on:
John LennonMick Jagger
Seuraavassa esimerkissä käytetään kvantoijan metamerkkejä{}
ilmoittaaksesi säännöllisen lausekkeen, jolla on seuraava logiikka:Vastaa minkä tahansa 11 merkin esiintymät, jotka esiintyvät HTML-joukon välillätunnisteet.
$ echo "John Lennon ja Mick Jagger" |grep -Po '(.{11})'
Tulos:
John LennonMick Jagger
Seuraava säännöllinen lauseke käyttää\w
metahahmoja vangitakseen hahmosta alkavan ryhmänJ
ja sen jälkeen nolla tai useampi sanamerkki. (Asana merkkion iso tai pieni kirjain, numeerinen merkki tai alaviiva. Muut välimerkit ja välimerkit ovateisanamerkit. Näin ollen vastaavuus pysähtyy, kun se kohtaa välilyönnin tai<
sisään
Muista,*
metamerkki tarkoittaa:Etsi nolla tai useampi edeltävä merkki. Tässä tapauksessa ilmaisu\w*
tarkoittaa:Etsi nolla tai useampi sanamerkki.
$ echo "John Lennon ja Mick Jagger" |grep -Po '(J\w*)'
Lähtö on:
JohnJagger
Seuraava säännöllinen lauseke käyttää\w
metahahmoja vangitakseen hahmon tapahtumiaJ
jota seuraa nolla tai useampi sanamerkki, jota seuraa sitten välilyönti. Lopuksi säännöllinen lauseke kaappaa joukon merkkejä, jotka vastaavat tekstiä, jossa on isoja kirjaimiaL
merkkiä seuraa nolla tai useampi sanamerkki. Joukko merkkejä, jotka vastaavat logiikkaa, palautetaan sieppausryhmänä.
$ echo "John Lennon ja Mick Jagger" |grep -Po '(J\w*\sL\w*)'
Lähtö on:
John Lennon
Seuraava säännöllinen lauseke on samanlainen kuin edellinen. Erona tässä esimerkissä on se, että kuvion ilmoitus kaappaa ryhmät, joiden sanat alkavat isoilla kirjaimillaM
, jota seuraa välilyönti ja sitten isoilla kirjaimilla alkavat sanatJ
:
$ echo "John Lennon ja Mick Jagger" |grep -Po '(M\w*\sJ\w*)'
Lähtö on:
Mick Jagger
Seuraava säännöllinen lauseke ilmoittaa sieppausryhmän, joka suorittaa seuraavan logiikan:Käsittele tekstiä nimetystä tiedostostaregex-content-01.html
. Etsi joukko hahmoja, jotka alkavat tavallisilla merkeilläbgcolor="
jota seuraa mikä tahansa merkki yhden tai useamman kerran, mutta lopeta ensimmäisen kohtaamisen jälkeen"
merkki.Ylimääräinen?
jälkeen*
merkki varmistaa, että sieppausryhmä pysähtyy ensimmäisen kerran, kun se kohtaa lopettavan"
hahmoa, eikä etsi lisää tällaisia hahmoja riviltä.
$ cat regex-content-01.html | grep -Po '(bgcolor=".*?")'
Tulos on:
bgcolor="#ffffff"
Seuraava säännöllinen lauseke perustuu edelliseen. Mutta se lisää "tai"-logiikkaa seuraavasti:Käsittele tekstiä nimetystä tiedostostaregex-content-01.html
. Etsi joukko hahmoja, jotka joko alkavat tavallisilla merkeilläbgcolor="
jota seuraa mikä tahansa merkki nolla tai useammin ja päättyy a:han"
merkkiä tai aloita tavallisilla merkeillätext="
jota seuraa mikä tahansa merkki nolla tai useammin ja päättyy a:han"
merkki:
$ cat regex-content-01.html | grep -Po '(bgcolor=".*?")|(text=".*?")'
Säännöllisen lausekkeen suorittamisen tulos on:
bgcolor="#ffffff"text="#000000"
Työskentely eteenpäin katsojien ja takana olevien kanssa
Näkymätjakatso taakseenovat sieppausryhmien tyyppejä, jotka kulkevat tekstin läpi, kunnes tietty kuvio syntyy. Näkymä kulkee merkkijonon läpi rivin alusta alkaen. Takana oleva katse kulkee linjan läpi päästään.
Metamerkit, jotka osoittavat tulevaisuutta, ovat:?=
. Metahahmot, jotka osoittavat katseen taakseen ovat:?<=
.
Eteenpäin ja takana olevat eivät sisällä niiden rajaa määrittelevää yhteensopivuusmallia.
Alla olevassa kuvassa 1 on visuaalinen analyysi merkkijonoon sovelletuista etenemis- ja takaosista:
Kuva 1: Esimerkkejä säännöllisten lausekkeiden kaappausryhmistä, joissa käytetään positiivista ja negatiivista lookbackia.
Tärkeä asia, joka on ymmärrettävä etu- ja takareunojen rajakuvioista, on se, että raja määräytyy ilmoitetun kaavan kokonaisuuden mukaan, ei kuvion merkkien järjestyksen mukaan. Tämä on erityisen tärkeää, kun tarkastellaan taakse katsomista.
Esimerkiksi lookbehind säännöllisessä lausekkeessa )(?<=
, regex-moottori etsii taaksepäin kuvion täydellisen esiintymisen varaltakuten luetaan vasemmalta oikealle. se oneitaaksepäin katsominen, oikealta vasemmalle lukeminen, kuvion jokaisen merkin käsittely muodossa
>
jonka jälkeens
jonka jälkeen<
. Tämä on hienovarainen ero, joka on pidettävä mielessä, kun mietitään mekaniikkaa, jolla regex-moottori prosessoi eteenpäin- ja taaksepäin katsomista.
Jatketaan nyt eteenpäin ja tarkastellaan etu- ja takaosien yksityiskohtia kuvan 1 mukaisesti.
Katsoa eteenpäin
Kuten edellä mainittiin, ennakointi on sellainen, jossa kaappausryhmä luodaan kulkemalla tekstiä tekstin alusta alkaen, kunnes havaitaan kaappausrajaa osoittava täsmäytyskuvio.
Harkitse tätä säännöllistä lauseketta:
.*(?=<\/p>
Tämä lauseke ilmoittaa seuraavan logiikan:Aloita tekstin alusta, yhdistä mitä tahansa merkkejä kerran tai monta kertaa, kunnes kohtaat merkit/p>
.(Tavallinen hahmo/
pakotetaan asettamalla säännöllinen lauseke escape-järjestelmä\
ennen sitä. Tämä vastaa sanomistaetsi HTML-tunniste
/
merkki on varattu merkki säännöllisen lausekkeen syntaksissa, the\
Escape-merkin on edeltävä merkkiä/
tavallinen merkki, jotta sitä ei käsitellä varahahmona.)Seuraavassa on esimerkki ennakoinnin suorittamisesta merkkijonoa vastaan
grep
niin kuin:$ echo "Kissa" | grep -Po '.*(?=<\/p>)'
Säännöllinen lauseke tuottaa seuraavan tuloksen:
Kissa
Huomaa, että tuloksena on kaappausryhmä, joka sisältää kaikki merkit paitsi
HTML-tunniste on tulevaisuuden raja.Seuraavaksi tarkastellaan taakse katsomisen käyttöä.
Katso taakse
Kuten edellä mainittiin, jälkikatselu on sellainen, jossa kaappausryhmä luodaan kulkemalla tekstin läpi sisällön lopusta alkaen, siirtymällä taaksepäin, kunnes havaitaan rajakuvio.
Metahahmot, jotka osoittavat katseen taakseen ovat:?<=
. Näitä merkkejä käytetään avoimissa ja sulkemissa suluissa, kuten on tyypillistä sieppausryhmän määrittämisessä.
Seuraava näyttää säännöllisen lausekkeen taakse: ).*(?<=
kuvaa seuraavaa logiikkaa:Aloita säännöllisen lausekkeen käsittelemän sisällön lopusta, siirrä tekstiä taaksepäin säännöllisiin merkkeihin astikohdataan. Palauta vastaava teksti, mutta älä palauta rajan taakse.
Seuraava esimerkki suorittaa lookbackin käyttämälläkaiku
-komento ja sitten tulos putkiingrep
. Grep-komento on määritetty suodattamaan säännöllisen lausekkeen mukaan.
$ echo "Kissa" | grep -Po '(?<=).*'
Tulos on:
Kissa
Huomaa, että hahmotjäävät pois kaappausryhmästä, jonka takana on palannut. Tämä on odotettavissa.
Laittamalla kaikki yhteen
Kaappaa ryhmät, ennakointi- ja jälkiseuraukset tuovat uuden ulottuvuuden säännöllisten lausekkeiden käyttöön tietojen suodattamiseen. Niiden oppiminen voi kuitenkin olla hankalaa. Kestää jonkin aikaa tottua säännöllisten lausekkeiden syntaksiin sieppausryhmille, eteenpäin ja taakse. Myös käsittelylogiikan vivahteiden ymmärtäminen voi viedä aikaa. Mutta aikainvestointi on sen arvoista. Pystyt käyttämään säännöllisiä lausekkeita tiiviimmin, tyylikkäämmin ja paljon tehokkaammin.
Toivottavasti artikkelissa esitetyt ja muut tämän sarjan esimerkit tarjoavat vankan perustan, josta voit jatkaa säännöllisten lausekkeiden hallintaasi.
Viimeksi päivitetty: 9. marraskuuta 2022
Viimeisimmät artikkelit
OpenShiftin täysi hyödyntäminen DevOpsissa
Varmuuskopioi Kubernetesin pysyvät taltiot OADP:n avulla
VMware Antrea on nyt yleisesti saatavilla OpenShiftissä
3 syytä jättää Docker pois Podmanille
Löydä mielenkiintoisia testitapauksia AI/ML:n ja Bunsenin avulla
Asiaan liittyvä sisältö
Aloittelijan opas säännöllisiin lausekkeisiin grepillä
Regex-ohjeet: kvantisoijat, kuviokokoelmat ja sanarajat
Suodata HTML-sisältöä grep-säännöllisten lausekkeiden avulla
Mitä seuraavaksi?
TämäLinux-huijauslehtiesittelee kehittäjille ja järjestelmänvalvojille Linux-komentoja, jotka heidän tulisi tietää. Opit tekstiapuohjelmista, levytyökaluista, verkkoyhteystyökaluista, käyttäjien ja käyttäjäryhmien hallinnasta ja muusta.
Lataa ilmainen huijauslehti