Före hypertextspråkens tillkomst, men snarare innanFrån det ögonblick som det blev klart att det inte bara var nödvändigt att söka, utan också att göra det under vissa förhållanden, på en specifik plats, med ändrade data, i rätt mängd, passade de vanliga sök- och ersättningsfunktionerna alla sofistikerade programmerare. Sökkonstens mästerverk skapades i programmeringsspråk och databaser förfinades i form av samplingsvillkor, utrustade med lagrade procedurer, triggers och andra metoder för sampling från skrymmande relationsinformationskompositioner. Tillkomsten av reguljära uttryck ledde inte till någon revolution, men det visade sig vara ett användbart och bekvämt verktyg för att hitta och ersätta information. Till exempel, JavaScript e-post reguljära uttryck förenklar registreringen av besökare avsevärt, ladda inte webbplatsen genom att skicka meddelanden till obefintliga adresser.
Säg att i JavaScript ett regexDet är omöjligt att säga att det gjorde skriptkoden kompakt, men dåligt förstådd av den oinitierade, är mycket bättre än de väl genomtänkta sekvenserna av anrop till indexOf () inramade av villkorliga och cykliska operatörer.
RegExp-objekt = mönster + motor
Reguljära uttryck är mönster + motor.Det första är det reguljära uttrycket i sig - ett JavaScript-objekt - RegExp, det andra är en mönsterexekutor som applicerar det på en sträng. Reguljära uttrycksmotorer är olika för varje programmeringsspråk. Även om inte alla skillnader är signifikanta, bör detta komma ihåg, samt se till att noggrant kontrollera det reguljära uttrycket innan du använder det.
Särskild notering när du skriver reguljära uttryckdet är ganska bekvämt och ganska effektivt, men det kräver omsorg, noggrannhet och tålamod från utvecklaren. Reguljära uttrycksmönsternotation tar lite tid att vänja sig vid. Detta är inte en hyllning till mode, detta är logiken i implementeringen av mekanismen "JavaScript reguljära uttryck".
Regex mönster
Två alternativ är tillåtna:
var expOne = / abc * / i;
var expTwo = RegExp ("abc *", "i");
Den första metoden används vanligtvis. I det andra fallet används citattecken, därför, för att använda tecknet "" måste det escapes enligt allmänna regler.
"i" är en flagga som anger "fallet är inte viktigt". Du kan också använda flaggorna "g" - "global sökning" och "m" - flerradssökning.
Det är vanligt att använda "/"-symbolen för att beteckna ett mönster.
Reguljära uttrycks början och slut
Tecknet "^" identifierar tecken från vilkadet reguljära uttrycket börjar och "$" anger vilka tecken som ska vara i slutet. Man ska inte experimentera med dem inom uttrycket, där har de en annan betydelse.
Till exempel
var eRegExp = nytt RegExp (cRegExp, "i");
var cRegRes = "";
var sTest = "AbcZ";
if (eRegExp.test (sTest)) {
cRegRes + = "- Ja";
} annat {
cRegRes + = "- Nej";
}
var dTestLine = document.getElementById ("scTestLine");
dTestLine.innerHTML = "Uttryck /" + cRegExp + "/ för raden" "+ sTest +" "" + cRegRes.
Elementet "scTestLine" kommer att innehålla resultatet (cRegExp-variabeln har motsvarande värde):
uttryck / ^ AbcZ $ / för sträng "abcz" - Ja
Om du tar bort "i"-flaggan blir resultatet:
uttryck / ^ AbcZ $ / för sträng "abcz" - Nej
Regelbundna uttrycksinnehåll
Ett reguljärt uttryck är en sekvens av tecken som det söks efter. Uttrycket / qwerty / letar efter en förekomst av denna exakta sekvens:
expression / qwerty / för sträng "qwerty" - Ja
expression / qwerty / för strängen "123qwerty456" - Ja
Symbolen "^" ändrar essensen av uttrycket:
uttryck / ^ qwerty / för strängen "123qwerty456" - Nej
uttryck / ^ qwerty / för strängen "qwerty456" - Ja
Likaså för radens slutkaraktär.Reguljära uttryck tillåter sekvenser: till exempel [a-z], [A-Z], [0-9] - alla bokstäver i det latinska alfabetet i det angivna fallet eller siffrorna. Ryska bokstäver är också tillåtna att användas, dock bör du vara uppmärksam på kodningen av strängarna (var det söks, vad det söks efter) och sidan. Ofta är ryska bokstäver, som specialtecken, att föredra för att ange koder.
När du bildar ett reguljärt uttryck kan duindikera alternativ för närvaron av vissa tecken på en viss plats, medan deras antal är inställt enligt följande: "*" = upprepning av 0 eller fler gånger; "+" = upprepning av 1 eller flera gånger; {1,} är samma som "+"; {n} = upprepa exakt n gånger; {n,} = upprepa n eller flera gånger; {n, m} = upprepa n till m gånger.
Med hjälp av hakparenteser kan du specificeravarianter av symbolen från uppsättningen. Det ser ut så här. [abcd] = [a-d] = något av fyra tecken: "a", "b", "c" eller "d". Motsatsen kan indikeras. Alla andra tecken än de som anges i uppsättningen: [^ abcd] = alla andra tecken än "a", "b", "c" eller "d". "?" indikerar att tecknet kanske inte finns på den här platsen. "." definierar alla tecken förutom en radmatning. De är "n", "r", "u2028" eller "u2029". Uttrycket "s * | S *" = "[s | S] *" betyder sökning efter vilket tecken som helst, inklusive nyrader.
Förenklade reguljära uttryck
Uttrycket "[s | S] *" - sök efter ett mellanslag eller dess frånvaro, det vill säga allt som finns i strängen. I det här fallet betyder notationen "s" ett mellanslag och "S" - dess frånvaro.
På samma sätt kan du använda "d" för att hitta en decimalsiffra, och "D" kommer att hitta ett icke-siffrigt tecken. Beteckningarna "f", "r" och "n" motsvarar formmatning, vagnretur och linjematning.
Tab-tecken är "t", vertikalt - "v". Beteckningen "w" matchar alla tecken i det latinska alfabetet (bokstäver, siffror, understreck) = [A-Za-z0-9_].
"W"-notationen motsvarar [^ A-Za-z0-9_]. Detta betyder alla tecken som inte är en latinsk bokstav, siffra eller "_".
Sök efter tecken "" = sök efter ett NUL-tecken. Sök "xHH" eller "uHHHH" = sök efter tecken med kod HH respektive HHHH. H är en hexadecimal siffra.
Rekommenderad ordalydelse och kodning för regex
Det är viktigt att noggrant testa eventuella reguljära uttryck på olika varianter av strängar.
Med erfarenhet av att skapa regex-felkommer att bli mindre, men ändå bör du alltid tänka på att din egen kunskap om reglerna för att skriva ett reguljärt uttryck kanske inte överensstämmer med verkligheten, särskilt när det "vanliga" överförs från ett språk till ett annat.
Att välja mellan klassikerna (exakt indikation) ochen förenklad version av det reguljära uttrycket är det bättre att föredra det första. Faktum är att i klassikerna är det alltid tydligt angivet vad som eftersträvas och hur. Om det finns ryska bokstäver i det reguljära uttrycket eller i söksträngen ska alla strängar och sidan där JavaScript-koden som kör det reguljära uttrycket körs konverteras till en enda kodning.
När du bearbetar tecken som inte tillhör det latinska alfabetet, är det vettigt att överväga att ange teckenkoderna och inte tecknen i sig.
När du implementerar sökalgoritmer i JavaScript bör det reguljära uttrycket kontrolleras noggrant. Det är särskilt viktigt att kontrollera teckenkodningen.
Parenteser inom reguljära uttryck
De fyrkantiga parenteserna indikerar varianterna av symbolen,som borde eller inte borde vara på en viss plats, och de runda är varianter av sekvenserna. Men detta är bara en allmän regel. Det finns inga undantag från detta, men det finns många olika användningsområden.
var cRegExp = "[a-z] *. (png | jpg | gif)";
var eRegExp = nytt RegExp (cRegExp, "i");
var cRegRes = "";
var sTest = "bild.jpg";
if (eRegExp.test (sTest)) {
cRegRes + = "- Ja";
} annat {
cRegRes + = "- Nej";
}
Resultat:
uttryck / [a-z ]*.(png|jpg|gif)/ för raden "picture.jpg" - Ja
uttryck /^^^^^^^^*.(png|jpg|gif)/ för strängen "picture.jpg" - Nej
uttryck /^^^^^^^^*.(png|jpg|gif)/ för strängen "apicture.jpg" - Ja
uttryck /^^^^^^^^*.(png|jpg|gif)/ för strängen "apicture.jg" - Nej
Det bör särskilt noteras att allt följt av en asterisk kan vara närvarande noll gånger. Det gör att det "vanliga" kan fungera på det mest oväntade sätt åtminstone.
RegExp-validering - e-posttestning
I JavaScript får reguljära uttryck två metoder, test och exec, och kan användas på String-objekt i deras metoder (funktioner): sök, dela, ersätt och matcha.
Testmetoden har redan demonstrerats, den låter dig kontrollera korrektheten av ett reguljärt uttryck. Metodresultat: sant / falskt.
Tänk på följande reguljära JavaScript-uttryck. E-postverifiering från numret "svårt, men korrekt":
var eRegExp = / ^ (([^ <> () [] \.,;: s @ "] + (. [^ <> () [] \.,;: s @"] +) *) | ( ". +")) @ (([[0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3}. [0-9] {1 , 3}]) | (([a-zA-Z-0-9] +.) + [A-zA-Z] {2,})) $ /;
för raden var sTest = "[email protected]" ger true, det vill säga den här raden är en giltig e-postadress. Testet utfördes med hjälp av metoden eRegExp.test (sTest).
Praktisk användning: bearbetning av e-post
Exec-metoden tillhandahåller en array på utgången, anrop:
var aResult = eRegExp.exec (sTest);
cRegRes = "<br/>" + aResult.length + "<br/>";
for (var i = 0; i <aResult.length; i ++) {
cRegRes + = aResult [i] + "<br/>";
}
ger ett resultat så här:
9
[email protected]
Slava.Chip
Slava.Chip
.Chip
odefinierad
sci.by
odefinierad
sci.by
sci.
Resten av metoderna fungerar på liknande sätt.Det rekommenderas att du kontrollerar dem själv. Det är tillrådligt att träna utvecklingen och användningen av reguljära uttryck i praktiken, att kopiera koden är inte alltid tillrådligt här.
Populära "stamgubbar"
Det angivna JavaScript-regexet förE-post är inte den enda, det finns många enklare alternativ där ute. Till exempel, /^ [w-. ]+@ [w- ]+. [a-z] [2,3 ]$/i. Det här alternativet tar dock inte hänsyn till alla alternativ för att registrera en e-postadress.
Det är verkligen nödvändigt att se över kollegornas erfarenheter,analysera deras föreslagna sätt innan du designar ditt eget reguljära JavaScript-uttryck. Men det finns också vissa svårigheter. Glöm inte att reguljära uttryck i JavaScript (exempel på dem när de kopieras) kan duplicera viktiga tecken: "", "/" eller citattecken. Detta kommer att leda till ett fel som kan sökas under lång tid.
Det är viktigt att tänka på den välbekanta "mänskliga aspekten".När allt kommer omkring kan ett formellt JavaScript-reguljärt uttryck för en telefon som kan vara en besökare (människa) specificeras på olika sätt: 123-45-67, (29) 1234567, 80291234567 eller +375291234567. Och allt är samma nummer. Alternativet att skriva flera mallar är inte alltid acceptabelt, och stel fixering av regeln för att skriva numret kan skapa onödiga besvär eller begränsningar. Alternativ / ^ d [d () -] {4,14} d $ / i fungerar för de flesta fall med verifiering av telefonnummer.
Om du behöver skriva JavaScript regelbundetuttryck som bara kontrollerar siffror, då kräver även ett så enkelt fall ett förtydligande. Han måste överväga ett heltal eller bråktal, exponentiell notation eller ett vanligt, positivt eller negativt tal. Du kan också ta hänsyn till närvaron av en valutasymbol, antalet siffror efter decimalkomma och uppdelningen av talets heltalsdel i triader.
Uttrycket / ^ d + $ / i kommer bara att kontrollera siffror, och uttrycket /^d+.d+$/i låter dig använda en punkt för att indikera bråkdelen av ett tal.
I JavaScript kan regex-valideringanvändas för att strikt ange formatet för de angivna uppgifterna, vilket är viktigt, särskilt när du anger frågeformulär, passdata, juridiska adresser, etc.
Datumvalidering – det är enkelt
Låt oss också titta på reguljära uttryck i JavaScript.Exempel på ett datum, såväl som ett nummer eller ett telefonnummer, representerar ett val mellan stelhet och flexibilitet. Datumet för händelsen är en av de väsentliga uppgifterna som du ofta måste ange. Men att fixa inmatningen i ett specifikt format: "dd-mm-åååå" eller "dm.åå" leder ofta till missnöje hos kunderna. Övergången från dagens inmatningsfält till månaden, utförd i den klassiska HTML-formen, kanske inte sker om du bara anger ett nummer, och inmatning av det andra kan orsaka svårigheter. Till exempel har 3 redan angetts i dagfältet, och nästa siffra 2 ersätter inte den första, och 32 är tilldelad den, vilket naturligtvis kommer att orsaka besvär.
Reguljära uttrycks effektivitet och bekvämlighetavsevärt beror på den allmänna uppbyggnaden av dialogen med besökaren. I ett fall, för att ange datum, är det lämpligt att använda ett inmatningsfält i formuläret, i ett annat fall måste du ange olika fält för dag, månad och år. Men då kommer det ytterligare "kodkostnader" för att kontrollera skottåret, antalet månader, antalet dagar i dem.
Ersättningssökning, regexminne
JavaScript ersätt (reguljära uttryck)använd en metod för ett String-objekt och låter dig hitta ett värde och ändra det direkt. Detta är användbart för att korrigera skrivfel, redigera innehållet i formulärfält och för att konvertera data från ett presentationsformat till ett annat.
var cRegExp = / ([a-z] +) s ([a-z] +) s ([a-z] +) / i; // tre "variabler" skapas under sökningen
var sTest = "den här artikeln är bra!";
var cRegRes = sTest.replace (cRegExp, "$ 2, $ 3, $ 1");
var dTestLine = document.getElementById ("scTestLine");
dTestLine.innerHTML = "Uttryck" + cRegExp + "för raden" "+ sTest +" "kommer att vara:" + cRegRes;
Resultat:
uttryck / ([a-z] +) s ([a-z] +) s ([a-z] +) / i för raden "den här artikeln är bra!" det kommer att visa sig: artikel, bra, den här!
När de exekveras lagrar varje par parentes resultatet i "variabeln" $ n, där n är numret på paret parentes ($ 1, $ 2, ...). Till skillnad från den allmänt accepterade är variablerna här numrerade från 1, inte från 0.
Allmänna rekommendationer
Regexet förenklar koden, men tiden är innedess design spelar ofta roll. Du kan börja med enkla konstruktioner, sedan kombinera det som har gjorts till mer komplexa uttryck. Du kan använda olika onlinebaserade regex-valideringstjänster eller speciella lokala verktyg.
Det bästa alternativet är att skapa din egenreguljära uttrycksbibliotek och ett anpassat verktyg för att kontrollera nya mönster. Detta är det bästa sättet att bygga vidare på erfarenheten och lära sig hur man snabbt skapar pålitliga och bekväma mönster.
Genom att använda upprepningar av tecken och rader, d.v.s.specialtecknen "*", "+" och lockiga hängslen som anger antalet repetitioner bör styras av principerna om enkelhet och ändamålsenlighet. Det är viktigt att förstå att ett reguljärt uttryck, från det att det börjar fungera tills resultatet erhålls, är helt beroende av motorn i den använda webbläsaren. Alla JavaScript-språk är inte skapade lika. Varje webbläsare kan ge sina egna personliga preferenser för tolkning av reguljära uttryck.
Kompatibilitet handlar inte bara om sidor och tabellerstilar, det har också att göra med reguljära uttryck. En sida som använder JavaScript kan endast anses vara felsökt när den har körts i olika webbläsare.
JavaScript, String och RegExp
Med rätt, arbeta på klientnivå, det vill säga ibesökarens webbläsare i JavaScript kräver höga kvalifikationer från utvecklaren. För ganska länge sedan blev det möjligt att felsöka JavaScript-kod med hjälp av webbläsarens egna medel eller med hjälp av tredjepartstillägg, kodredigerare och oberoende program.
Men inte i alla fall kan felsökarenhantera och ge utvecklaren bra support, snabb felsökning, upptäckt av flaskhalsar. De dagar då datorn var inriktad på datoranvändning ligger i ett avlägset förflutet. Fokus ligger nu på information och strängobjekt spelar en viktig roll. Siffror har blivit strängar, och de manifesterar sin sanna essens endast vid rätt tidpunkt och på rätt plats.
Regelbundna uttryck utnyttjar kraften i strängar, men kräver den respekt de förtjänar. Att felsöka RegExp medan det körs, även om det är möjligt att simulera det, är inte en särskilt intressant idé.
Att förstå strukturen och logiken för RegExp-objektet, betydelsen av String-objektet, syntaxen och semantiken för JavaScript är en säker garanti för säker och pålitlig kod, stabil drift av varje sida och webbplatsen som helhet.