Reguliere expressies zijn witruimtetekens. Reguliere expressies voor beginners. Een reguliere expressie toepassen op een tekenreeks

Reguliere expressies zijn een van de krachtigste tools voor gegevensmanipulatie in JavaScript... Bovendien is het de handigste manier om gegevens te verwerken in gevallen waarin het exacte zoekpatroon niet kan worden gespecificeerd. Het eenvoudigste voorbeeld is om alle e-mailadressen en telefoonnummers in de tekst te selecteren. Het is duidelijk dat een eenvoudige zoekopdracht naar een subtekenreeks niet kan worden gedaan, aangezien we weten vooraf niet welke adressen en telefoonnummers in de tekst zullen verschijnen.

Reguliere expressies werken niet op exacte waarden, maar op patronen. Het patroon is geschreven met behulp van de reguliere expressietaal en we zullen nu kennis maken met de basis ervan.

Elke reguliere expressie bestaat dus uit een scheidingsteken, een sjabloontekst en modifiers (soms ook schakelaars genoemd).

/ patroon / schakelaar

Hier is "/" het scheidingsteken, "patroon" is de hoofdtekst van het patroon en "schakelaar" is de modifiers.

Er zijn slechts twee manieren om reguliere expressies in JavaScript te gebruiken: met behulp van methoden van het RegExp-object of met behulp van methoden van het String-object.

Een instantie van een RegExp-object kan op twee manieren worden geïnstantieerd - expliciet en indirect:

// expliciete manier var re = nieuwe RegExp ("patroon", "switch"); // indirecte (alternatieve) manier var re = / patroon / schakelaar;

Merk op dat de indirecte methode het patroon ZONDER aanhalingstekens specificeert.

Elke reguliere expressie bestaat uit gewone tekens, speciale tekens en herhalingskwantificatoren. Letters, cijfers en symbolische tekens fungeren als gewone tekens, terwijl nationale tekens en symbolen in Unicode als tekens kunnen worden gebruikt. Aandacht! De "spatie" in reguliere expressies wordt ook als significant beschouwd, dus wees heel voorzichtig bij het toevoegen van spaties aan de expressie. Beter nog, gebruik het speciale metateken (zie het \ s-teken in de onderstaande tabel).

Speciale tekens (of metatekens) vormen de basis van reguliere expressies, omdat het zijn de speciale karakters die de zoekvolgorde bepalen en de tolk van de uitdrukking aanvullende voorwaarden en beperkingen aangeven. De tabel bevat de belangrijkste speciale tekens en hun korte beschrijving.

Speciaal karakter Patroon matching
\ Voor tekens die meestal letterlijk worden genomen, betekent dat het volgende teken speciaal is. Bijvoorbeeld, / n / komt overeen met de letter n en / \ n / komt overeen met het teken van de nieuwe regel. Voor tekens die doorgaans als speciaal worden behandeld, betekent dat het teken letterlijk moet worden genomen. Bijvoorbeeld, / ^ / betekent het begin van een regel, en / \ ^ / komt alleen overeen met het ^-teken. / \\ / komt overeen met backslash \.
^ Komt overeen met het begin van de regel.
$ Komt overeen met het einde van de regel.
(patroon) Komt overeen met het tekenreekspatroon en onthoudt de gevonden overeenkomst.
(?: patroon) Komt overeen met het tekenreekspatroon, maar onthoudt de gevonden overeenkomst niet. Gebruikt om delen van een patroon te groeperen, bijvoorbeeld / ko (?: T | schaal) / is een verkorte notatie voor / cat | cat /.
(? = patroon) Look-ahead matching vindt plaats wanneer patroon overeenkomt zonder de overeenkomende overeenkomst op te slaan. Bijvoorbeeld / Windows (? = 95 | 98 | NT | 2000) / komt overeen met "Windows" op de regel "Windows 98" maar komt niet overeen met de regel "Windows 3.1". Na het matchen gaat het zoeken verder vanaf de positie volgend op de match, zonder vooruitkijken.
(?! patroon) Look-ahead matching vindt plaats wanneer de patroontekenreeks niet overeenkomt zonder de overeenkomst op te slaan. Bijvoorbeeld / Windows (?! 95 | 98 | NT | 2000) / komt overeen met "Windows" op "Windows 3.1" maar komt niet overeen met "Windows 98". Na het matchen gaat het zoeken verder vanaf de positie volgend op de match, zonder vooruitkijken.
x | ja Komt overeen met x of y.
Komt overeen met elk teken tussen vierkante haken.
[^ xyz] Komt overeen met elk teken behalve die tussen vierkante haken.
Komt overeen met elk teken in het opgegeven bereik.
[^ a-z] Komt overeen met elk ander teken dan het opgegeven bereik.
\ B Komt overeen met een woordgrens, dat wil zeggen de positie tussen een woord en een spatie of regelinvoer.
\ B Komt overeen met elke andere positie dan een woordgrens.
\ cX Komt overeen met het symbool Ctrl + X. Bijvoorbeeld, / \ cI / is gelijk aan / \ t /
\ NS Komt overeen met de figuur. Equivalent.
\ NS Komt overeen met een niet-cijferig teken. Gelijk aan [^ 0-9].
\ F Komt overeen met een formaatvertaalteken (FF).
\ N Komt overeen met een regelinvoerteken (LF).
\ R Komt overeen met een regelterugloopteken (CR).
\ s Komt overeen met een spatieteken. Gelijk aan / [\ f \ n \ r \ t \ v] /.
\ S Komt overeen met elk niet-witruimteteken. Gelijk aan / [^ \ f \ n \ r \ t \ v] /.
\ t Komt overeen met het tabteken (HT).
\ v Komt overeen met een verticaal tab-teken (VT).
\ met Komt overeen met een Latijnse letter, cijfer of onderstrepingsteken. Gelijkwaardig aan / /.
\ W Komt overeen met elk ander teken dan een Latijnse letter, cijfer of onderstrepingsteken. Gelijk aan / [^ A-Za-z0-9_] /.
\ N n is een positief getal. Komt overeen met de zoveelste onthouden subtekenreeks. Geëvalueerd door de linker haakjes te tellen. Als de haakjes links voor dit teken kleiner zijn dan n, dan is \ 0n equivalent.
\ 0n n - octaal getal, niet meer dan 377. Komt overeen met karakter met octale code n. Bijvoorbeeld, / \ 011 / is gelijk aan / \ t /.
\ xn n is een tweecijferig hexadecimaal getal. Komt overeen met karakter met hexadecimale code n. Bijvoorbeeld, / \ x31 / is gelijk aan / 1 /.
\ un n is een viercijferig hexadecimaal getal. Komt overeen met Unicode-teken met hexadecimale code n. Bijvoorbeeld, / \ u00A9 / is gelijk aan / © /.
. Punt. Past bij elk karakter.

Er zijn veel speciale tekens en ze kunnen worden gebruikt om bijna alle woordcombinaties of zoektermen te beschrijven.

Het tweede deel van het patroon zijn kwantoren. Dit is een subset van speciale tekens die de voorwaarde specificeert voor herhalende tekens of hun groepen. De kwantor wordt rechts van de uitdrukking geschreven en verspreidt zich naar het dichtstbijzijnde teken of de dichtstbijzijnde groep. Bijvoorbeeld:

(patroon_1) | (patroon_2) (quotum)

Hier verwijst de kwantor "quont" alleen naar "patroon_2".

De tabel geeft een overzicht van alle belangrijke kwantoren:

Kwantificator Patroon matching
* Komt overeen met het vorige teken dat nul of meer keer wordt herhaald.
+ Komt een of meerdere keren overeen met de herhaling van het vorige teken.
? Komt overeen met een herhaling van het vorige teken nul of één keer. ... Komt overeen met elk ander teken dan een teken voor een nieuwe regel.
(N) n is een niet-negatief getal. Komt overeen met exact n exemplaren van het vorige teken.
(N,) n is een niet-negatief getal. Komt overeen met n of meer exemplaren van het vorige teken. / x (1,) / is gelijk aan / x + /. / x (0,) / is gelijk aan / x * /.
(n, m) n en m zijn niet-negatieve getallen. Komt overeen met minimaal n en maximaal m voorkomens van het vorige teken. / x (0,1) / is gelijk aan / x? /.

We hebben dus kennis gemaakt met de basis van de reguliere expressietaal en nu gaan we nieuwe kennis in de praktijk uitproberen. Hier is een voorbeeld met de methode test ()

Een voorbeeld van het gebruik van de exec () methode

In dit voorbeeld gebruiken we een alternatieve manier om een ​​RegExp-object te maken:

Het volgende voorbeeld is een real-life script. Hiermee kunt u een bug verwijderen met het weergeven van transparantie van PNG-afbeeldingen in Internet Explorer-versies 5 en 6. We noemden dit script al toen we keken naar lagen en hun gebruik in JavaScript.

Functie correctPNG () (// controleer de handtekeningreeks van de browser van de gebruiker als (/ MSIE (5 \ .5 | 6). + Win / .test (navigator.userAgent)) (for (var i = 0; i "img.outerHTML = strNewHTML i = i-1)))) window.attachEvent (" onload ", correctPNG);

Hier gebruiken we reguliere expressies om te controleren of het script wordt uitgevoerd in IE van de versies die we willen. Als de controle mislukt, is er geen verdere verwerking nodig en kunt u het script gewoon voltooien.

Ontwerp

/ MSIE (5 \ .5 | 6) + Win / .test (navigator.userAgent)

leest als volgt: "controleer of de tekenreeks in de eigenschap navigator.userAgent overeenkomt met het volgende patroon: een MSIE-tekenreeks gevolgd door een spatie, dan de tekensets" 5.5 "of" 6 ", gevolgd door een of meer tekens, gevolgd door de ingestelde tekens "Win" ".

We hebben hier alleen de meest gebruikte functies behandeld. Een meer gedetailleerde lijst vindt u eenvoudig op internet. Reguliere expressies zijn krachtig, maar niet zonder hun nadelen. En de belangrijkste is productiviteit. Het ontleden, compileren en patroonherkenning in een tekst is veel duurder dan een simpele exacte match. Ga daarom niet tot het uiterste en gebruik reguliere expressies voor exacte zoekopdrachten.

De syntaxis van reguliere expressies is behoorlijk complex en vereist veel inspanning om te leren. De beste gids voor reguliere expressies is tegenwoordig het boek van J. Friedl "Regular Expressions", dat het volgens de auteur mogelijk maakt "te leren denken in reguliere expressies".

Basisconcepten

Reguliere expressie- een middel voor het verwerken van tekenreeksen of een reeks tekens die een tekstpatroon definieert.

Aanpasser- bedoeld om een ​​reguliere expressie te "instrueren".

metakarakters- speciale tekens die dienen als commando's in de reguliere expressietaal.

De reguliere expressie wordt gespecificeerd als een gewone variabele, alleen een schuine streep wordt gebruikt in plaats van aanhalingstekens, bijvoorbeeld: var reg = / reg_expression /

Met de eenvoudigste sjablonen bedoelen we sjablonen die geen speciale tekens nodig hebben.

Laten we zeggen dat het onze taak is om alle letters "p" (klein en hoofdletter) te vervangen door de Latijnse hoofdletter "R" in een zin Normale uitdrukkingen.

Een sjabloon maken var reg = / p / en met behulp van de methode vervangen wij voeren onze plannen uit

Als resultaat krijgen we de regel - Normale uitdrukkingen, vond de vervanging pas plaats bij het eerste voorkomen van de letter "p", hoofdlettergevoelig.

Maar dit resultaat past niet bij de voorwaarden van onze taak ... Hier hebben we nodig modifiers"g" en "i", die afzonderlijk of samen kunnen worden gebruikt. Deze modifiers worden aan het einde van het reguliere expressiepatroon geplaatst, na de schuine streep, en hebben de volgende betekenis:

modifier"g" - specificeert de zoekopdracht in de string als "globaal", d.w.z. in ons geval zal de vervanging plaatsvinden voor alle exemplaren van de letter "p". Het sjabloon ziet er nu als volgt uit: var reg = / p / g door het in onze code te vervangen

we krijgen de lijn - Normale uitdrukkingen.

modificatie "ik"- stelt de zoekopdracht in een string ongevoelig voor hoofdletters door deze modifier toe te voegen aan onze sjabloon var reg = / p / gi, na het uitvoeren van het script, krijgen we het gewenste resultaat van onze taak - NORMALE UITDRUKKINGEN.

Speciale tekens (metatekens)

Metatekens specificeren het type tekens van de zoekreeks, de manier waarop de zoekreeks in de tekst wordt omgeven, evenals het aantal tekens van een bepaald type in de gescande tekst. Daarom kunnen metakarakters worden onderverdeeld in drie groepen:

  • Zoek metatekens overeenkomen.
  • Kwantitatieve metatekens.
  • Metatekens positioneren.

Match metakarakters

Betekenis

Beschrijving

woord grens

specificeert de voorwaarde waaronder het patroon moet worden uitgevoerd aan het begin of einde van een woord

/ \ ber / valt samen met fout, komt niet overeen held of met speler
/ eh / valt samen met speler, komt niet overeen held of met fout
/ \ ber \ b / komt niet overeen held of met speler of met fout, kan alleen overeenkomen met eh

geen woordgrens

specificeert een voorwaarde waaronder het patroon niet wordt uitgevoerd aan het begin of einde van een woord

/ \ Ber / valt samen met held of met speler, komt niet overeen fout
/ eh \ B / valt samen met fout of met speler, komt niet overeen held
/ \ Ber \ B / valt samen met held, komt niet overeen speler of met fout

een cijfer van 0 tot 9

/ \ d \ d \ d \ d / komt overeen met elk viercijferig nummer

/ \ D \ D \ D \ D / zal niet overeenkomen 2005 of 05.y of №126 enzovoort.

enkel leeg teken

komt overeen met een spatie

\ over \ sbyte \ komt alleen overeen over byte

enkel niet-blanco teken

een willekeurig teken behalve een spatie

\ over \ Sbyte \ valt samen met overbyte of met over_byte, komt niet overeen over byte of over - byte

letter, cijfer of onderstrepingsteken

/ Een \ w / valt samen met A1 of met AB, komt niet overeen een +

geen letter, cijfer of onderstrepingsteken

/ EEN \ W / komt niet overeen A1 of met AB, valt samen met een +

elk karakter

alle tekens, letters, cijfers, enz.

/.../ komt overeen met drie willekeurige tekens abc of [e-mail beveiligd] of 1 q

karakterset

specificeert de voorwaarde waaronder het patroon moet worden uitgevoerd voor elke overeenkomst van tekens tussen vierkante haken

/ WERTY / valt samen met Qwerty, met AWERTY

een set niet inbegrepen karakters

specificeert een voorwaarde waaronder het patroon niet mag worden uitgevoerd voor een overeenkomst van tekens tussen vierkante haken

/ [^ QA] WERTY / komt niet overeen Qwerty, met AWERTY

De tekens in de tabel "Overeenkomen met metatekens voor zoeken" moeten niet worden verward met de volgorde van springende tekens die in tekenreeksen worden gebruikt, zoals \\ t - tabulatie, \\ n - nieuwe regel, enz.

Kwantitatieve metatekens

Aantal toevalligheden

Nul of meer keer

/ Ja * vaScript / valt samen met JvaScript of met JavaScript of met JaaavaScript, komt niet overeen JovaScript

Nul of een keer

/ Ja? VaScript / komt alleen overeen JvaScript of met JavaScript

Een of meerdere keren

/ Ja + vaScript / valt samen met JavaScript of met JavaScript of met JaaavaScript, komt niet overeen JvaScript

precies n keer

/ Ja (2) vaScript / komt alleen overeen JavaScript

n of meer keer

/ Ja (2,) vaScript / valt samen met JavaScript of met JaaavaScript, komt niet overeen JvaScript of met JavaScript

minstens n keer, maar niet meer dan m keer

/ Ja (2,3) vaScript / komt alleen overeen JavaScript of met JaaavaScript

Elk teken in de tabel "Kwantitatieve metatekens" is van toepassing op één voorafgaand teken of metateken in de reguliere expressie.

Metatekens positioneren

De laatste set metatekens is bedoeld om aan te geven waar (indien belangrijk) moet worden gezocht naar een subtekenreeks aan het begin van een tekenreeks of aan het einde.

Enkele technieken om met sjablonen te werken

vervangen- we hebben deze methode al helemaal aan het begin van het artikel gebruikt, het is ontworpen om naar een patroon te zoeken en de gevonden substring te vervangen door een nieuwe substring.

uitvoerend- deze methode voert string-matching uit met het patroon dat door de sjabloon is gespecificeerd. Als het patroon mislukt, wordt null geretourneerd. Anders is het resultaat een reeks subtekenreeksen die overeenkomen met het gegeven patroon. / * Het eerste element van de array zal gelijk zijn aan de originele string die overeenkomt met het gegeven patroon * /

bijvoorbeeld:

als resultaat krijgen we vier regels:
Geboortedatum: 15-09-1980
Verjaardag: 15
Geboortemaand: 09
Geboren in 1980

Conclusie

Het artikel toont niet alle mogelijkheden en charmes van reguliere expressies; voor een diepere studie van dit probleem zou ik je aanraden om het RegExp-object te bestuderen. Ik wil ook uw aandacht vestigen op het feit dat de syntaxis van reguliere expressies niet anders is in zowel JavaScript als PHP. Om bijvoorbeeld de juistheid van een e-mailinvoer te controleren, ziet een reguliere expressie voor JavaScript en PHP er hetzelfde uit /[e-mail beveiligd]+ (2,3) / i.

Reguliere expressies voor beginners

Wat zijn reguliere expressies?

Als je ooit met de opdrachtregel hebt gewerkt, heb je waarschijnlijk bestandsnaammaskers gebruikt. Als u bijvoorbeeld alle bestanden in de huidige map die met de letter "d" beginnen, wilt verwijderen, kunt u rm d * schrijven.

Reguliere expressies zijn een vergelijkbaar maar veel krachtiger hulpmiddel om strings te vinden, ze te vergelijken met een patroon en soortgelijk werk te doen. De Engelse naam van dit instrument is Normale uitdrukkingen of gewoon RegExp... Strikt genomen zijn reguliere expressies een speciale taal voor het beschrijven van stringpatronen.

De implementatie van deze tool verschilt in verschillende programmeertalen, hoewel niet veel. In dit artikel zullen we ons voornamelijk concentreren op de implementatie van de Perl-compatibele reguliere expressies.

Basis syntaxis

Allereerst is het vermeldenswaard dat elke string zelf een reguliere expressie is. Dus de uitdrukking Haha komt natuurlijk overeen met de tekenreeks "Haha" en alleen dat. Reguliere expressies zijn hoofdlettergevoelig, dus de tekenreeks "haha" (met een kleine letter) komt niet langer overeen met de bovenstaande expressie.

Maar al hier moet je voorzichtig zijn - zoals elke taal hebben reguliere expressies speciale tekens die moeten worden ontsnapt. Hier is een lijst van hen:. ^ $ * +? () \ | (). Ontsnappen doe je op de gebruikelijke manier - door een \ toe te voegen voor het speciale teken.

Karakterset

Stel dat we in de tekst alle tussenwerpsels willen vinden die op lachen duiden. Het is alleen dat Haha niet bij ons past - "Hehe", "Hoho" en "Hihi" zullen er tenslotte niet onder vallen. En het probleem met de eerste letter moet op de een of andere manier worden opgelost.

Hier komen sets ons te hulp - in plaats van een specifiek teken te specificeren, kunnen we een hele lijst schrijven, en als een van de vermelde tekens op de gespecificeerde plaats in de onderzochte tekenreeks voorkomt, wordt de tekenreeks als geschikt beschouwd. Sets worden tussen vierkante haken geschreven - het patroon komt overeen met elk van de tekens "a", "b", "c" of "d".

Binnen set b O De meeste speciale tekens hoeven niet te worden ontsnapt, maar het gebruik van \ ervoor wordt niet als een fout beschouwd. Het is nog steeds nodig om te ontsnappen aan de tekens "\" en "^", en bij voorkeur "]" (dus geeft elk van de tekens "]" of "[" aan, terwijl [x] uitsluitend de reeks "[x" is). ]"). Het schijnbaar ongebruikelijke gedrag van stamgasten met het "]"-teken wordt eigenlijk bepaald door bekende regels, maar het is veel gemakkelijker om gewoon aan dit personage te ontsnappen dan om ze te onthouden. Bovendien moet het "-"-symbool worden ontsnapt, het wordt gebruikt om bereiken in te stellen (zie hieronder).

Als onmiddellijk na [schrijf het symbool ^, krijgt de set de tegenovergestelde betekenis - elk ander symbool dan de gespecificeerde wordt als geschikt beschouwd. Dus het patroon [^ xyz] komt overeen met elk teken, behalve eigenlijk "x", "y" of "z".

Dus, als we deze tool toepassen op ons geval, als we [Xx] [aoie] x [aoie] schrijven, dan zal elk van de regels "Haha", "hehe", "hehey" en zelfs "Hoho" overeenkomen met het patroon.

Vooraf gedefinieerde tekenklassen

Voor sommige sets die vrij vaak worden gebruikt, zijn er speciale sjablonen. Dus om elk witruimteteken (spatie, tabulatie, regeleinde) te beschrijven, wordt \ s gebruikt, voor cijfers - \ d, voor Latijnse tekens, cijfers en onderstrepingsteken "_" - \ w.

Als het nodig is om enig teken te beschrijven, wordt hiervoor een punt - gebruikt. ... Als de opgegeven klassen zijn geschreven met een hoofdletter (\ S, \ D, \ W), dan veranderen ze hun betekenis in het tegenovergestelde - elk niet-witruimteteken, elk teken dat geen cijfer is en elk ander teken dan respectievelijk het Latijnse alfabet, cijfers of onderstrepingstekens.

Met reguliere expressies is het ook mogelijk om de positie van de regel ten opzichte van de rest van de tekst te controleren. De uitdrukking \ b is een woordgrens, \ B is geen woordgrens, ^ is het begin van de tekst en $ is het einde. Dus, volgens het patroon \ bJava \ b, worden de eerste 4 tekens gevonden in de tekenreeks "Java en JavaScript", en volgens het patroon \ bJava \ B - tekens 10 tot 13 (als onderdeel van het woord "JavaScript" ).

bereiken

Mogelijk moet u een set aanwijzen die letters bevat, bijvoorbeeld van "b" tot "f". In plaats van [bwgdezhziklmnoprstuf] te schrijven, kun je het bereikmechanisme gebruiken en [bf] schrijven. Het patroon x komt dus overeen met de tekenreeks "xA6", maar komt niet overeen met "xb9" (ten eerste omdat alleen hoofdletters in het bereik worden aangegeven en ten tweede omdat 9 niet is opgenomen in de interval 0 - acht).

Het bereikmechanisme is vooral relevant voor de Russische taal, omdat er geen constructie voor is zoals \ w. Om alle letters van het Russische alfabet aan te duiden, kunt u het patroon [a-yaA-Yayo] gebruiken. Houd er rekening mee dat de letter "ё" niet is opgenomen in de algemene reeks letters en afzonderlijk moet worden gespecificeerd.

Quantifiers (die het aantal herhalingen specificeren)

Laten we teruggaan naar ons voorbeeld. Wat als het "lachende" tussenwerpsel meer dan één klinker heeft tussen de "x", bijvoorbeeld "Haahaaaa"? Ons oude reguliere seizoen zal ons niet meer kunnen helpen. Hier moeten we kwantoren gebruiken.

Merk op dat de kwantor alleen van toepassing is op het teken dat eraan voorafgaat.

Sommige veelgebruikte constructies hebben speciale notaties gekregen in de reguliere expressietaal:

Dus met behulp van kwantoren kunnen we ons sjabloon voor tussenwerpsels verbeteren tot [xx] [aoei] + x [aoei] *, en het zal de strings "Haaha", "heeeeeh" en "Hihii" kunnen herkennen.

Luie kwantificering

Laten we zeggen dat het onze taak is om alle HTML-tags in een string te vinden

Tproger- mijn favoriet site over programmeren!

Een voor de hand liggende oplossing<.*>het zal hier niet werken - het zal de hele string vinden, aangezien het begint met een alineatag en eindigt ermee. Dat wil zeggen, de inhoud van de tag zal de tekenreeks zijn

P> Tproger- mijn favoriet site over programmeren!

Dit komt doordat de kwantoren standaard werken volgens de zogenaamde. hebberig algoritme - probeert de langst mogelijke string te retourneren die aan de voorwaarde voldoet. Er zijn twee manieren om het probleem op te lossen. De eerste is om een ​​uitdrukking te gebruiken<[^>] *>, waarmee wordt voorkomen dat een haaks haakje wordt beschouwd als de inhoud van de tag. De tweede is om de kwantor niet hebzuchtig te verklaren, maar lui... Wordt dit gedaan door een teken rechts van de kwantor toe te voegen? ... Die. om alle tags te vinden, gaat de uitdrukking naar<.*?> .

jaloerse kwantificering

Soms, om het zoeken te versnellen (vooral in gevallen waarin de tekenreeks niet overeenkomt met de reguliere expressie), kunt u het algoritme gebruiken om terug te gaan naar eerdere zoekstappen om mogelijke overeenkomsten voor de rest van de reguliere expressie te vinden. Het heet jaloers kwantificering. De kwantor wordt jaloers gemaakt door een + aan de rechterkant toe te voegen. Een ander gebruik van jaloerse kwantificering is het elimineren van ongewenste matches. Dus het patroon ab * + a in de tekenreeks "ababa" komt alleen overeen met de eerste drie tekens, maar niet met tekens van de derde tot de vijfde, omdat het teken "a", dat op de derde positie staat, is al gebruikt voor het eerste resultaat.

Beugelgroepen

Voor ons sjabloon van "lachende" tussenwerpsels is er nog maar een klein beetje over - houd er rekening mee dat de letter "x" meer dan eens kan voorkomen, bijvoorbeeld "Hahahahaahahahaoooo", of het kan zelfs eindigen met de letter "x". Waarschijnlijk moeten we de kwantor voor de groep [aioe] + x toepassen, maar als we gewoon [aioe] x + schrijven, dan zal de kwantor + alleen verwijzen naar het teken "x" en niet naar de hele uitdrukking. Om dit op te lossen, moet de uitdrukking tussen haakjes staan: ([aioe] x) +.

Dus onze uitdrukking verandert in [Xx] ([aioe] x?) + - eerst is er een hoofdletter of kleine letter "x", en dan een willekeurig niet-nul aantal klinkers, die (mogelijk, maar niet noodzakelijk) worden afgewisseld met enkele kleine letter "x". Deze uitdrukking lost het probleem echter slechts gedeeltelijk op - regels als bijvoorbeeld "hihaheh" zullen ook onder deze uitdrukking vallen - iemand kan zo lachen, maar de veronderstelling is zeer twijfelachtig. Het is duidelijk dat we een set van alle klinkers maar één keer kunnen gebruiken, en dan moeten we op de een of andere manier vertrouwen op het resultaat van de eerste zoekopdracht. Maar hoe?…

Het zoekresultaat per groep opslaan (feedback)

Het blijkt dat het resultaat van een zoekopdracht met een haakjesgroep naar een aparte geheugenlocatie wordt geschreven, die toegankelijk is voor gebruik in volgende delen van de reguliere expressie. Terugkerend naar de taak om HTML-tags op de pagina te vinden, moeten we misschien niet alleen de tags vinden, maar ook hun naam. Reguliere expressie kan ons hierbij helpen.<(.*?)> .

Tproger- mijn favoriet site over programmeren!

Zoekresultaat voor alle reguliere expressies: “

”, “”, “”, “”, “”, “

”.
Zoekresultaat voor de eerste groep: “p”, “b”, “/ b”, “i”, “/ i”, “/ i”, “/ p”.

Er kan naar het groepszoekresultaat worden verwezen met de uitdrukking \ n, waarbij n een cijfer van 1 tot 9 is. De uitdrukking (\ w) (\ w) \ 1 \ 2 komt bijvoorbeeld overeen met de tekenreeksen "aaaa", "abab" , maar komt niet overeen met " aabb ".

Als een uitdrukking alleen tussen haakjes staat om er een kwantor aan toe te passen (het is niet de bedoeling om het zoekresultaat voor deze groep te onthouden), voeg dan onmiddellijk ?: toe aan het eerste haakje, bijvoorbeeld (?: + \ W).

Met dit mechanisme kunnen we onze uitdrukking herschrijven naar de vorm [xx] ([aoie]) x? (?: \ 1x?) *.

Opsomming

Om te controleren of een tekenreeks overeenkomt met ten minste één van de patronen, kunt u de analoog van de booleaanse OR-operator gebruiken, die wordt geschreven met de | ... De lijnen "Anna" en "Eenzaamheid" vallen dus respectievelijk onder het patroon Anna | Eenzaamheid. Het is vooral handig om opsommingen tussen haakjesgroepen te gebruiken. Dus bijvoorbeeld (?: A | b | c | d) is volledig equivalent (in dit geval heeft de tweede optie de voorkeur vanwege de prestaties en leesbaarheid).

In JavaScript worden reguliere expressies weergegeven door RegExp-objecten. RegExp-objecten kunnen worden gemaakt met behulp van de RegExp () -constructor, maar vaker worden ze gemaakt met behulp van een speciale letterlijke syntaxis. Net zoals letterlijke tekenreeksen worden gespecificeerd als tekens tussen aanhalingstekens, worden letterlijke uitdrukkingen voor reguliere expressies gespecificeerd als tekens tussen een schuine streep / paar.

/ patroon / markeert nieuwe RegExp ("patroon" [, zoekopties])

patroon- reguliere expressie voor zoeken (over vervanging - later), en vlaggen - een reeks van een willekeurige combinatie van tekens g (algemeen zoeken), i (hoofdlettergebruik is niet belangrijk) en m (zoeken op meerdere regels). De eerste methode wordt vaak gebruikt, de tweede soms. Twee van dergelijke oproepen zijn bijvoorbeeld equivalent.

zoek opties

Bij het maken van een reguliere expressie kunnen we extra zoekopties specificeren

JavaScript-tekens voor reguliere expressies

SymboolCorrespondentie
Alfanumerieke tekenszichzelf passen
\0 NUL-teken (\ u0000)
\ tTabblad (\ u0009)
\ NRegelinvoer (\ u000A)
\ vVerticaal tabblad (\ u000B)
\ FPaginavertaling (\ u000C)
\ RKoetsretour (\ u000D)
\ xnnLatijns teken, gespecificeerd door het hexadecimale getal nn; bijv. \ x0A is hetzelfde als \ n
\ uxxxxUnicode-teken, gespecificeerd door het hexadecimale getal xxxx; bijv. \ u0009 is hetzelfde als \ t
\ cXEscape-teken "X", bijvoorbeeld \ cJ is gelijk aan regelinvoer \ n
\ Voor gewone karakters, maakt ze speciaal. De uitdrukking / s / zoekt bijvoorbeeld alleen naar het teken "s". En als je \ voor s plaatst, dan geeft / \ s / al een spatieteken aan. Omgekeerd, als het teken speciaal is, bijvoorbeeld *, dan maakt \ het gewoon een normaal sterretje. Bijvoorbeeld, / a * / zoekt naar 0 of meer opeenvolgende "a"-tekens. Om een ​​a te vinden met een asterisk "a *" - plaats \ voor de special. teken: / een \ * /.
^ Geeft het begin van de invoer aan. Als de zoekvlag voor meerdere regels ("m") is ingesteld, wordt deze ook geactiveerd wanneer een nieuwe regel begint. Bijvoorbeeld, / ^ A / vindt "A" niet in "een A", maar vindt de eerste "A" " in "Een A."
$ Geeft het einde van de invoer aan. Als de zoekvlag voor meerdere regels is ingesteld, werkt deze ook aan het einde van de regel. Bijvoorbeeld, / t $ / zal "t" niet vinden in "eater", maar wel in "eat".
* Geeft herhaling van 0 of meer keren aan. Bijvoorbeeld, / bo * / vindt "boooo" in "A ghost booooed" en "b" in "A bird warbled", maar niets in "A goat grunted".
+ Geeft herhaling van 1 of meerdere keren aan. Gelijk aan (1,). Bijvoorbeeld / a + / komt overeen met "a" in "candy" en alle "a" in "caaaaaandy".
? Geeft aan dat het element al dan niet aanwezig is. Bijvoorbeeld, / e? Le? / Komt overeen met "el" in "angel" en "le" in "angle." Indien gebruikt onmiddellijk na een van de kwantoren *, +,? , of (), specificeert vervolgens een "niet-greedy"-zoekopdracht (het minimaal mogelijke aantal keren herhalen, tot het dichtstbijzijnde volgende element van het patroon), in tegenstelling tot de standaard "greedy"-modus, waarin het aantal herhalingen is maximaal, zelfs als het volgende element van het patroon ook geschikt is. gebruikt in de preview, die wordt beschreven in de onderstaande tabel (? =), (?!), en (? :).
. (Decimaal punt) geeft elk ander teken aan dan een nieuwe regel: \ n \ r \ u2028 of \ u2029. (u kunt [\ s \ S] gebruiken om naar elk teken te zoeken, inclusief nieuwe regels). Bijvoorbeeld, /.n/ komt overeen met "an" en "on" in "nee, er hangt een appel aan de boom", maar niet met "nee".
(x)Vindt x en onthoudt. Dit wordt "geheugensteunen" genoemd. Bijvoorbeeld, / (foo) / zal "foo" vinden en onthouden in "foo bar". De gevonden subtekenreeks wordt opgeslagen in de array met zoekresultaten of in de vooraf gedefinieerde eigenschappen van het RegExp-object: $ 1, ..., $ 9. Bovendien combineren haakjes wat erin staat in een enkel patroonelement. Bijvoorbeeld (abc) * - abc 0 of meer keer herhalen.
(?: x)Vindt x, maar herinnert zich niet wat het heeft gevonden. Dit wordt "niet-herinnerende haakjes" genoemd. De gevonden subtekenreeks wordt niet opgeslagen in de resultatenarray en RegExp-eigenschappen.Zoals alle haakjes, combineren ze hun inhoud in een enkel subpatroon.
x (? = y)Vindt x alleen als x wordt gevolgd door y. Bijvoorbeeld / Jack (? = Sprat) / komt alleen overeen met "Jack" als het wordt gevolgd door "Sprat". / Jack (? = Sprat | Frost) / komt alleen overeen met "Jack" als het wordt gevolgd door "Sprat" of "Frost". Noch "Sprat" noch "Frost" zal echter in het zoekresultaat verschijnen.
x (?! y)Vindt x alleen als x niet wordt gevolgd door y. /\d+(?!\.)/ komt bijvoorbeeld alleen overeen met een getal als het niet wordt gevolgd door een decimaalteken. /\d+(?!\.)/.exec("3.141 ") zal 141 vinden, maar niet 3.141.
x | jaVindt x of y. Bijvoorbeeld / groen | rood / vindt "groen" in "groene appel" en "rood" in "rode appel".
(N)Waarbij n een positief geheel getal is. Vindt precies n herhalingen van het voorgaande element. Bijvoorbeeld, / a (2) / zal "a" niet vinden in "candy", maar het zal zowel a in "caandy" als de eerste twee a in "caaandy" vinden.
(N,)Waarbij n een positief geheel getal is. Vindt n of meer herhalingen van een item. Bijvoorbeeld, / a (2,) zal "a" niet vinden in "candy", maar zal alle "a" in "caandy" en in "caaaaaaandy" vinden.
(n, m)Waarbij n en m positieve gehele getallen zijn. Vind n tot m herhalingen van het element.
Karakterset. Vindt een van de volgende tekens. U kunt een tussenruimte opgeven met een streepje. Bijvoorbeeld, - hetzelfde als. Komt overeen met b in borst, en a en c in pijn.
[^ xyz]Elk ander teken dan gespecificeerd in de set. U kunt ook een tussenruimte opgeven. [^ abc] is bijvoorbeeld hetzelfde als [^ a-c]. Komt overeen met "r" in "brisket" en "h" in "chop".
[\ B]Vindt het backspace-teken. (Niet te verwarren met \ b.)
\ BVindt een woordgrens (Latijn), zoals een spatie. (Niet te verwarren met [\ b]). Bijvoorbeeld, / \ bn \ w / komt overeen met "nee" in "middag"; / \ wy \ b / komt overeen met "ly" in "mogelijk gisteren".
\ BGeeft geen woordgrens aan. Bijvoorbeeld, / \ w \ Bn / komt overeen met "aan" in "middag" en / y \ B \ w / komt overeen met "ye" in "mogelijk gisteren".
\ cXWaarbij X een letter is van A tot Z. Geeft een controleteken in een string aan. Bijvoorbeeld / \ cM / staat voor het Ctrl-M-teken.
\ NSvindt een cijfer uit een willekeurig alfabet (we hebben Unicode). Gebruik alleen om gewone nummers te vinden. Bijvoorbeeld / \ d / of // komt overeen met "2" in "B2 is het suitenummer".
\ NSVindt een niet-cijferig teken (alle alfabetten). [^ 0-9] - Gelijk aan gewone cijfers. Bijvoorbeeld / \ D / of / [^ 0-9] / komt overeen met "B" in "B2 is het suitenummer".
\ sKomt overeen met elk witruimteteken, inclusief spatie, tabs, regelinvoer en andere Unicode-witruimtetekens. Bijvoorbeeld / \ s \ w * / komt overeen met "bar" in "foo bar".
\ SKomt overeen met elk teken behalve witruimte. Bijvoorbeeld / \ S \ w * / komt overeen met "foo" in "foo bar".
\ vVerticaal tabteken.
\ metKomt overeen met elk verbaal (Latijns alfabet) teken, inclusief letters, cijfers en onderstrepingstekens. Equivalent. Bijvoorbeeld / \ w / komt overeen met "a" in "appel", "5" in "$ 5,28" en "3" in "3D".
\ WKomt overeen met elk niet- (lat.) Word-teken. Gelijk aan [^ A-Za-z0-9_]. Bijvoorbeeld, / \ W / en / [^ $ A-Za-z0-9 _] / komen overeen met "%" in "50%".

Werken met reguliere expressies in Javascript

Werken met reguliere expressies in Javascript wordt geïmplementeerd door methoden van de klasse String

exec (regexp) - Vindt alle overeenkomsten (voorkomen van een "regexp" -patroon) in een tekenreeks. Retourneert een array (indien overeenkomend) en werkt de eigenschap regexp bij, of null als er niets is gevonden. Met de g-modifier - elke keer dat deze functie wordt aangeroepen, wordt de volgende overeenkomst geretourneerd na de eerder gevonden - dit wordt geïmplementeerd door de offset-index van de laatste zoekopdracht te behouden.

match (regexp) - zoek een deel van een string op patroon. Als de g-modifier is opgegeven, retourneert de functie match () een array van alle overeenkomsten of null (in plaats van een lege array). Zonder de g-modifier werkt deze functie als exec ();

test (regexp) - de functie controleert de string tegen een patroon. Retourneert waar als er een overeenkomst is en onwaar als er geen overeenkomst is.

split (regexp) - Splitst de string die wordt aangeroepen in een array van substrings met het argument als scheidingsteken.

vervang (regexp, mix) - de methode retourneert de gewijzigde tekenreeks in overeenstemming met het patroon (reguliere expressie). De eerste regexp-parameter kan ook een tekenreeks bevatten in plaats van een regexp. Zonder de g-modifier - vervangt de methode in de regel alleen de eerste instantie; met de g-modifier - er is een globale vervanging, d.w.z. alle gebeurtenissen in de gegeven regel worden gewijzigd. mix - vervangingspatroon, kan waarden van een string accepteren, vervangingspatroon, functie (functienaam).

Speciale tekens in de vervangende string

Vervanging via functie

Als u een functie opgeeft als de tweede parameter, wordt deze bij elke overeenkomst uitgevoerd. In een functie kunt u dynamisch een vervangende tekenreeks genereren en retourneren. De eerste parameter van de functie is de gevonden substring. Als het eerste argument dat moet worden vervangen een RegExp-object is, bevatten de volgende n parameters geneste overeenkomsten tussen haakjes. De laatste twee parameters zijn de positie in de string waar de match plaatsvond en de string zelf.

Laatst bijgewerkt: 1.11.2015

Normale uitdrukkingen vertegenwoordigen een patroon dat wordt gebruikt om een ​​tekenreeks te zoeken of te wijzigen. Om met reguliere expressies in JavaScript te werken, wordt een object gedefinieerd RegExp.

Er zijn twee manieren om een ​​reguliere expressie te definiëren:

Var mijnExp = / hallo /; var myExp = nieuwe RegExp ("hallo");

De hier gebruikte reguliere expressie is vrij eenvoudig: het bestaat uit een enkel woord "hallo". In het eerste geval wordt de uitdrukking tussen twee schuine strepen geplaatst en in het tweede geval wordt de RegExp-constructor gebruikt, waarin de uitdrukking als een tekenreeks wordt doorgegeven.

RegExp-methoden

Om te bepalen of een reguliere expressie overeenkomt met een tekenreeks, wordt de methode test () gedefinieerd in het RegExp-object. Deze methode retourneert true als de tekenreeks overeenkomt met de reguliere expressie, en false als dat niet het geval is.

Var initialText = "hallo wereld!"; var exp = / hallo /; var resultaat = exp.test (initialText); document.write (resultaat + "
"); // true initialText =" mooi weer "; result = exp.test (initialText); document.write (resultaat); // false - er is geen" hallo "in de regel initialText

De exec-methode werkt op dezelfde manier - het controleert ook of de tekenreeks overeenkomt met een reguliere expressie, alleen retourneert deze methode nu het deel van de tekenreeks dat overeenkomt met de uitdrukking. Als er geen overeenkomst is, wordt null geretourneerd.

Var initialText = "hallo wereld!"; var exp = / hallo /; var resultaat = exp.exec (initiële tekst); document.write (resultaat + "
"); // hallo initialText =" prachtig weer "; resultaat = exp.exec (initialText); document.write (resultaat); // null

Karaktergroepen

Een reguliere expressie hoeft geen reguliere tekenreeks te zijn, maar kan ook speciale syntaxiselementen voor reguliere expressies bevatten. Een van deze elementen vertegenwoordigt groepen tekens tussen vierkante haken. Bijvoorbeeld:

Var initialText = "verdediging"; var exp = / [abc] /; var resultaat = exp.test (initialText); document.write (resultaat + "
"); // true initialText =" city "; result = exp.test (initialText); document.write (resultaat); // false

De uitdrukking [abc] geeft aan dat de tekenreeks een van de drie letters moet hebben.

Als we de aanwezigheid van alfabetische tekens uit een bepaald bereik in een string moeten bepalen, dan kunnen we dit bereik eenmalig instellen:

Var initialText = "verdediging"; var exp = / [a-z] /; var resultaat = exp.test (initialText); document.write (resultaat + "
"); // true initialText =" 3di0789 "; result = exp.test (initialText); document.write (resultaat); // false

In dit geval moet de tekenreeks ten minste één teken uit het a-z-bereik bevatten.

Als het daarentegen niet nodig is dat de string alleen bepaalde karakters heeft, dan is het nodig om het ^-teken tussen vierkante haken te zetten voor de opsomming van karakters:

Var initialText = "verdediging"; var exp = / [^ a-z] /; var resultaat = exp.test (initialText); document.write (resultaat + "
"); // false initialText =" 3di0789 "; exp = / [^ 0-9] /; result = exp.test (initialText); document.write (resultaat); // true

In het eerste geval mag de tekenreeks niet alleen tekens uit het bereik az bevatten, maar aangezien de tekenreeks "defense" alleen uit tekens uit dit bereik bestaat, retourneert de methode test () false, dat wil zeggen dat de reguliere expressie niet overeenkomt met de voorraad.

In het tweede geval ("3di0789") mag de tekenreeks niet alleen numerieke tekens bevatten. Maar aangezien de tekenreeks ook letters bevat, komt de tekenreeks overeen met de reguliere expressie, dus de testmethode retourneert waar.

Indien nodig kunnen we combinaties van uitdrukkingen verzamelen:

Var initialText = "thuis"; var exp = / [dt] o [nm] /; var resultaat = exp.test (initialText); document.schrijven (resultaat); // waar

De uitdrukking [dt] o [nm] geeft die strings aan die de substrings "house", "volume", "don", "tone" kunnen bevatten.

Expressie-eigenschappen

    Met de globale eigenschap kunt u alle subtekenreeksen vinden die overeenkomen met de reguliere expressie. Bij het zoeken naar subtekenreeksen selecteert de reguliere expressie standaard de eerste gevonden subtekenreeks uit de tekenreeks die overeenkomt met de uitdrukking. Hoewel er veel subtekenreeksen in een tekenreeks kunnen zijn die ook overeenkomen met de uitdrukking. Hiervoor wordt deze eigenschap gebruikt in de vorm van het symbool g in uitdrukkingen

    Met de eigenschap negerenCase kunt u subtekenreeksen vinden die overeenkomen met de reguliere expressie, ongeacht de hoofdletters van de tekens in de tekenreeks. Om dit te doen, wordt het i-teken gebruikt in reguliere expressies

    Met de eigenschap multiline kunt u subtekenreeksen vinden die overeenkomen met een reguliere expressie in tekst met meerdere regels. Om dit te doen, wordt het m-symbool gebruikt in reguliere expressies.

Bijvoorbeeld:

Var initialText = "hallo wereld"; var exp = / wereld /; var resultaat = exp.test (initialText); // false

Er is geen overeenkomst tussen de tekenreeks en de uitdrukking, omdat "Wereld" verschilt van "Wereld" voor het geval dat. In dit geval moet u de reguliere expressie wijzigen door er de eigenschap negerenCase aan toe te voegen:

Var exp = / wereld / ik;

Welnu, we kunnen ook meerdere eigendommen tegelijk gebruiken.