Kehittynyt regex: Kaappaa ryhmiä, ennakoivia ja jälkikäteen | Red Hat -kehittäjä (2024)

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 tulosteenkaikukomentogrepapuohjelma. Thegrepapuohjelma käyttää säännöllistä lauseketta sisällön suodattamiseen. Säännöllisten lausekkeiden esittelyn edutgrepettä 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 ankaikukomento, joka ohjaa merkkijonon a:hangrepkomento, 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ää\dmetamerkit, jotka osoittavatmikä tahansa numeerinen numero:

(\DDD)

Jälleen syötämme merkkijonongrepjoka 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 Lennon
Mick 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 Lennon
Mick Jagger

Seuraava säännöllinen lauseke käyttää\wmetahahmoja vangitakseen hahmosta alkavan ryhmänJja 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ää\wmetahahmoja vangitakseen hahmon tapahtumiaJjota 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 kirjaimiaLmerkkiä 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:

Kissa

.

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 varalta

kuten luetaan vasemmalta oikealle. se oneitaaksepäin katsominen, oikealta vasemmalle lukeminen, kuvion jokaisen merkin käsittely muodossa>jonka jälkeensjonka 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

.Mutta koska/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

Kissa

käyttämällä echo-komentoa ja liittämällä tuloksen kohteeseengrepniin 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

. TheHTML-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 asti

kohdataan. 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ä hahmot

jää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

Kehittynyt regex: Kaappaa ryhmiä, ennakoivia ja jälkikäteen | Red Hat -kehittäjä (2024)
Top Articles
Latest Posts
Article information

Author: Stevie Stamm

Last Updated:

Views: 5942

Rating: 5 / 5 (60 voted)

Reviews: 91% of readers found this page helpful

Author information

Name: Stevie Stamm

Birthday: 1996-06-22

Address: Apt. 419 4200 Sipes Estate, East Delmerview, WY 05617

Phone: +342332224300

Job: Future Advertising Analyst

Hobby: Leather crafting, Puzzles, Leather crafting, scrapbook, Urban exploration, Cabaret, Skateboarding

Introduction: My name is Stevie Stamm, I am a colorful, sparkling, splendid, vast, open, hilarious, tender person who loves writing and wants to share my knowledge and understanding with you.