Säännölliset sulut: esimerkkejä kaikista tyypeistä (2023)

Regex Parentheses: Examples of Every Type (3)

Törmäsin äskettäin koodausongelmaan, joka sisälsi sulut merkkijonoon, ja tavoitteeni oli korvata sulut ja kaikki niiden sisällä. Ensimmäiset ajatukseni olivat - löydä tapa käyttää säännöllistä lauseketta!

Tajusin nopeasti, etten tiennyt säännöllisen lausekkeen sulkeista niin paljon kuin luulin. Joten ajattelin, että olisi mukava jakaa, mitä löysin sukelluksessani sulujen erilaisista käyttötavoista säännöllisissä lausekkeissa. Osoittautuu, että niitä on 3 erilaista!

Aluksi on kolme erityyppistä sulkumerkkiäkirjaimellinen,vangitseminen, jaei-kaappaus.

Jos olet käyttänyt regexiä aiemmin, tunnet todennäköisesti ainakin kirjaimelliset sulut ja luultavasti jopa sieppaussulut. Kuitenkin, jos olet kuten minä, et ehkä ole kuullut sulkeiden kaappaamatta jättämisestä säännöllisissä lausekkeissa. Tässä lyhyessä viestissä käsitellään jokaista sulkutyyppiä ja jaetaan esimerkkejä ymmärryksemme parantamiseksi.

Tämä on tavallaan miltä se kuulostaa, haluamme kirjaimellisesti täsmäyttää merkkijonossa käytetyt sulut. Koska sulkeita käytetään myös ryhmien kaappaamiseen ja ei-kaappaukseen, meidän on vältettävä avaussulkua kenoviivalla.

Oletetaan, että meille annetaan kirjan verran tekstiä, ja haluamme löytää aina, kun kirjoittaja laittaa jotain sulkeisiin, mukaan lukien itse sulut. Regex voi näyttää tältä:

const literalRegex = /\([^()]+\)/g

Sitten käyttämällä ote Lorem Ipsumista, jossa sulut on kytketty kolmeen paikkaan, voimme testata regeximme.ottelu()menetelmä ja hakea kaikki käytetyt suluissa olevat testilausekkeet:

const book = "Lorem ipsum dolor be amet, consectetur adipiscing elit. For ac purus dignissim, imperdiet dui sed, dignissim nyt. Mutta faucibus turpis ne ultricies tempus. Integer scelerisque neque nisi (test1), at volutudapat augue malesm. urn. Suspendisse potenti. Aliquam id sem sem. Suspendisse mollis no eu ex tempor, et tincidunt risus condimentum. In non felis est. In ut tortor eget elit faucibus volutpat eget (test2) vulputate quam. Mutta se oli ex, consequatsed , ei ole porta pellentesque. Jopa molestie libero sed lacus (test3) feugiat, hendrerit tempus eros interdum. Tullakseen nyt feugiatiksi hänen ei tarvitse koristella pintaa naurulla. Phasellus quis malesuada diam. Quisque."const allMatches = book.match(literalRegex)console.log(allMatches) //["(test1)", "(test2)", "(test3)"]

Selitys mitenkirjaimellinenRegextoimii:

/— Avaa tai aloittaa säännöllisen lausekkeen.
\(— Poistaa kirjaimellisesti yhden avaavan sulkumerkin.
[^()]– Mikä tahansa hahmoei(^) avaava tai sulkeva sulku ((tai)). Hakasulkeet edustavat merkkiluokkaa, ja kun ne yhdistetään aloitussulkeen ([^), se kumoaa sisällä olevat merkit – lisätietoja löytyitässä.
+ - Yksi tai useampi mitä tahansa, mikä tulee suoraan ennen sitä (tässä tapauksessa se on koko yllä oleva merkkiluokka)
\)— Poistaa yhden sulkevan kirjaimellisen sulkumerkin.
/— Sulkee säännöllisen lausekkeen.
g— Globaali lippu antaa meille mahdollisuuden palauttaa jokaisen yksittäisen osuman taulukossa pelkän taulukon ensimmäisen osuman sijaan.

Näitä sulkuja käytetään ryhmittelemään merkkejä yhteen, joten nämä ryhmät "kaappaa" niin, että niitä voidaan käyttää uudelleen taustaviittauksien kanssa tai antaa kvantifi, kuten esim.+tai*. Ne eivät vastaa sulkuja kirjaimellisesti, vain niiden sisällä olevat merkit, joten näitä ei tarvitse jättää kenoviivalla, vaan käytämme sitä "metamerkkinä", kuten se tunnetaan.

Capture and Use Quantifier

Tässä on esimerkki, jossa haluamme käyttää samaa mallia uudelleen DNA-sekvenssissä, joka koostuu kaikista A:n T:istä C:stä ja G:stä. Tavoitteemme on palauttaa joukko joka kerta, kun kuviota "CAT" käytetään. Jos kuviota seuraa välittömästi täsmälleen sama kuvio, se pidentää taulukkoon lisättävää merkkijonoa:

const capturingRegex = /(CAT)+/g

Jälleen kerran käyttämällä.ottelu()Metodi palauttaa taulukon jokaisella merkkijonosta löydetyllä esiintymällä:

const dnaSequence = "GATCGATCATCATCATGGTATAGATGCTGATATGATCGCATCATTCGTAGTCGTGACCATCATCATCATCATCATGATGCGGATGTTATAGTAGTAGTCGGCCGATGTAGCTGGATCGACATCATCATCATTGCTAGTCGTCATCATGCTATCATTCTAGGCCTATCTATCTAG "const catMatches = dnaSequence.match(capuringRegex)console.log(catMatches) // ["CATCATCAT", "CATCAT", "CATCATCATCATCATCAT", "CATCATCATCAT", "CATCAT", "CATCAT", "CAT", "CAT"]

En ole varma, mitä tehdä tämän henkilön korkeasta "CAT"-määrästä, mutta toivottavasti se osoittaa suluissa olevan kuvion toistettavuuden.

Jakaumakaapata Regex:

/— Avaa tai aloittaa säännöllisen lausekkeen .
(KISSA)— Kaappaa ryhmä, jonka sisällä on kuvio "CAT".
+— Yksi tai useampi niistä, jotka tulivat suoraan ennen sitä, tässä tapauksessa se on kaappausryhmä yhden merkin sijaan.
/— Sulkee säännöllisen lausekkeen.
g – Globaali lippu antaa meille mahdollisuuden palauttaa jokaisen taulukon yksittäisen osuman taulukon ensimmäisen osuman sijaan.

Kaappaa ja käytä taustaviittausta

Voisimme myös käyttää taustaviittausta, jos meidän on käytettävä sieppausryhmää myöhemmin regexissä sen sijaan, että se olisi välittömästi alkuperäisen mallin vieressä, kuten viimeisessä esimerkissä.

Tässä käytämme sitä etsimään alkuperäisen kuvion, joka on joko "TAG" tai "TAT", ja sitten "G"-kirjaimen jälkeen etsii uudelleen, kumpi kuvio löydettiin alkuperäisestä sieppausryhmästä. Toisin sanoen etsimme mallia, joka on joko "TAGGTAG" tai "TATGTAT":

const newCapturingRegex = /(TAG|TAT)G\1/gconst newSequence = "TAGGTAGCCCCCCCCCCCTATGTATCCCCCCCCCCCTAGGTAGCCCCTAGGTAGTAGGTAGTATGTATTATGTATCCCCCCCCCCCCCCTATGTATTATGTATTATGTATCCCCCCCCCTAGGTAGTAGGTAGCCC"const dnaMatches = newSequence.match(newCapturingRegex)console.log(dnaMatches) //["TAGGTAG", "TATGTAT", "TAGGTAG", "TAGGTAG", "TAGGTAG", "TATGTAT", "TATGTAT", "TATGTAT", "TATGTAT", "TATGTAT"," TAGGTAG, "TAGGTAG"]

JakaumauusiCapturingRegex:

/— Avaa tai aloittaa säännöllisen lausekkeen.
(PÄIVÄ|TEOLLE)— Sieppausryhmä, joka vastaa joko "TAG" tai "TAT".
G— G-kirjaimen merkkijono.
\1— Taustaviittaus, joka viittaa ensimmäiseen sieppausryhmään (tässä tapauksessa ainoa sieppausryhmä). Jos säännöllisessä lausekkeessa olisi käytetty toista sieppausryhmää, sitä voitaisiin käyttää uudelleen lisätyllä taustaviittauksella, kuten näin:\2.
/— Sulkee säännöllisen lausekkeen.
g— Globaali lippu antaa meille mahdollisuuden palauttaa jokaisen yksittäisen osuman taulukossa pelkän taulukon ensimmäisen osuman sijaan.

Vastaa menetelmä G-lippulla, joka on poistettu Regexistä

Jos poistammeglippu säännöllisen lausekkeen lopusta, sen sijaan, että saisimme takaisin jokaisen yksittäisen vastaavuuden taulukossa, saamme takaisin erilaisen taulukon. Ensimmäinen säännöllisen lausekkeen löytämä vastaavuus on indeksi[0]uudessa taulukossa, ja jokainen seuraava indeksi sen jälkeen on se, mikä kaapattiin sieppausryhmissä, joita käytetään siinä järjestyksessä, jossa ne löytyvät säännöllisestä lausekkeesta.

Voimme myös käyttää pistemerkintää löytääksemme ensimmäisen merkin indeksin ottelussa (.indeksi), ja etsi myös itse alkumerkkijono (.input). Katsotaanpa esimerkkiä:

const noFlagRegex = /(foo).*(bar)/const fooBarString = "Foo käveli baariin..."const fooBarMatch = fooBarString.match(noFlagRegex)console.log(fooBarMatch[0]) // "foo käveli baariin"
console.log(fooBarMatch[1]) // "foo"
console.log(fooBarMatch[2]) // "palkki"
console.log(fooBarMatch.index) // 2
console.log(fooBarMatch.input) // "Huo käveli baariin..."

JakaumanoFlagRegexkiinnostuneille:

/— Avaa tai aloittaa säännöllisen lausekkeen.
(foo)— Sieppausryhmä, joka sisältää kuvion "foo".
.— Jokerimerkkiä edustava metamerkki, mikä tahansa merkki toimii.
*- 0 tai enemmän kaikesta sitä edeltäneestä (tässä tapauksessa.).
(baari)— Sieppausryhmä, joka sisältää kuvion "foo".
/— Sulkee säännöllisen lausekkeen.

Tämän tyyppiset sulut, joista en henkilökohtaisesti tiennyt mitään ennen niiden tutkimista, ja uskon, että tämä pätee todennäköisesti muihin regex-aloittelijoihin, kuten minä. Ei-kaappaavat ryhmät tekevät periaatteessa saman kuin kaappaavat ryhmät, paitsi, miltä se kuulostaa, emme "kaappaa" sulkeiden välistä mallia.

Jos emme lisääglippu ja käytä.ottelumenetelmällä, saamme takaisin yllä olevan esimerkin kaltaisen taulukon, mutta emme saa sieppausryhmää indeksiin[1]ja niin edelleen, yksinkertaisesti täydellinen haku hakemistossa[0], ja meillä on edelleen sama käyttökyky.indeksija.inputkuten suoraan yllä oleva esimerkki.

Ei-kaappaavat ryhmät alkavat(?:ja kaikki, mikä seuraa kaksoispistettä ennen sulkevaa sulkua, ryhmitellään, mutta sitä ei kaapata eikä tallenneta vastaavaan taulukkoon. Katsotaanpa esimerkkiä, jossa tarkistamme, että puhelinyhteystieto on tässä muodossa: herra/ms/rouva ensimmäinen viimeinen (xxx) xxx-xxxx, ja haluamme puhelinnumeron suuntanumeron olevan ainoa sieppausryhmä (löytyy hakemistosta[1]), mutta meidän on ryhmitettävä yhteen myös herra/ne/rouva.

const contactRegex = /(?:mr|ms|mrs) \w+ \w+ \((\d{3})\) \d{3}-\d{4}/const contactInfo = "hra Tyler Funk (555) 888-7777"const contactMatch = contactInfo.match(contactRegex)console.log(contactMatch[0]) // "mr Tyler Funk (555) 888-7777"
console.log(contactMatch[1]) // 555
console.log(contactMatch.index) // 0
console.log(contactMatch.input) // "mr Tyler Funk (555) 888-7777"

Indeksi[0]ja.indeksitässä esimerkissä eivät ole niin hyödyllisiä, koska koko vastaavuus on tässä tapauksessa itse koko merkkijono, mikä luonnollisesti muodostaa osuman ensimmäisen indeksin0. Valitsimme kuitenkin hakemistossa olevan puhelinnumeron suuntanumeron[1]jättämällä kaappaamatta ensimmäistä ryhmää, jota käytetään mr/ms/mrs.

Jakaumaota yhteyttä Regexiin:

/— Avaa tai aloittaa säännöllisen lausekkeen.
(?:mr|ms|rouva)— Ei-kaappausryhmä, joka etsii kuviota "mr" tai "ms" tai "mrs", jota seuraa välilyönti.
\w+- metamerkki, joka etsii mitä tahansa "sana"-merkkiä (\w- kirjaimet), jota seuraa kvantori, joka etsii yhtä tai useampaa mitä tahansa ennen sitä (+), ja myös välilyönti. (tätä käytetään kahdesti sekä etu- että sukunimessä)
\(— Avoimet sulut kirjaimellisesti.
(\d{3})— Kaappaa ryhmä, joka etsii täsmälleen 3 ({3}) numerot (\d).
\)— Sulkeen kirjaimellinen, jota seuraa välilyönti.
\d{3}— Jälleen kerran täsmälleen 3 numeroa (tunnetaan muuten numeromerkeinä).
-— Tavumerkki.
\d{}– Tarkalleen 4 numeroa.
/— Sulkee säännöllisen lausekkeen.

Siinä on säännöllisten sulujen ydin! Toivottavasti tämä on ollut sinulle jollakin tavalla informatiivinen ja vaivan arvoinen. Tässä on joitain resursseja, joita käytin tutkiessani tätä aihetta:

- Todella hieno artikkeli, joka auttoi minua ymmärtämään, että siellä oli 3 erilaista sulkua -tässä. Lue "Mutta odota, siellä on enemmän!" osio alareunassa!

— Erinomainen yleinen regex-resurssi, mutta erityinen sivu, jota pidin hyödyllisenä erikoismerkkien/metamerkkien ymmärtämiseen paremmin —tässä.

Hyvää hakkerointia kaikille!

Top Articles
Latest Posts
Article information

Author: Kelle Weber

Last Updated: 02/12/2023

Views: 6531

Rating: 4.2 / 5 (53 voted)

Reviews: 92% of readers found this page helpful

Author information

Name: Kelle Weber

Birthday: 2000-08-05

Address: 6796 Juan Square, Markfort, MN 58988

Phone: +8215934114615

Job: Hospitality Director

Hobby: tabletop games, Foreign language learning, Leather crafting, Horseback riding, Swimming, Knapping, Handball

Introduction: My name is Kelle Weber, I am a magnificent, enchanting, fair, joyous, light, determined, joyous person who loves writing and wants to share my knowledge and understanding with you.