Voor de komst van hyperteksttalen, maar eerderVanaf het moment dat duidelijk werd dat het niet alleen nodig was om te zoeken, maar ook om het onder bepaalde omstandigheden, op een specifieke plaats, met gewijzigde gegevens, in de juiste hoeveelheden, te doen, waren de gebruikelijke zoek- en vervangfuncties geschikt voor elke geavanceerde programmeur. Meesterwerken van de kunst van het zoeken werden gecreëerd in programmeertalen en databases werden verfijnd in de vorm van bemonsteringscondities, uitgerust met opgeslagen procedures, triggers en andere middelen om te bemonsteren uit omvangrijke relationele informatiecomposities. De opkomst van reguliere expressies leidde niet tot een revolutie, maar het bleek een handig en handig hulpmiddel te zijn om informatie te vinden en te vervangen. Bijvoorbeeld, JavaScript-e-mail reguliere expressies vereenvoudigen de registratie van bezoekers enorm; laad de site niet door berichten te sturen naar niet-bestaande adressen.
Zeg dat in JavaScript een regexHet is onmogelijk om te zeggen dat het de scriptcode compact heeft gemaakt, maar slecht begrepen door niet-ingewijden, veel beter is dan doordachte reeksen van aanroepen naar indexOf () omlijst door voorwaardelijke en cyclische operators.
RegExp-object = patroon + engine
Reguliere expressies zijn patroon + motor.De eerste is de reguliere expressie zelf - een JavaScript-object - RegExp, de tweede is een patroonuitvoerder die deze toepast op een string. Reguliere expressie-engines zijn verschillend voor elke programmeertaal. Hoewel niet alle verschillen significant zijn, moet hier rekening mee worden gehouden, en zorg ervoor dat u de reguliere expressie zorgvuldig valideert voordat u deze gebruikt.
Speciale notatie bij het schrijven van reguliere expressieshet is best handig en behoorlijk effectief, maar het vereist zorg, nauwkeurigheid en geduld van de ontwikkelaar. De patroonnotatie van reguliere expressies is even wennen. Dit is geen eerbetoon aan mode, dit is de logica van de implementatie van het mechanisme "JavaScript reguliere expressies".
Regex-patroon
Er zijn twee mogelijkheden:
var expOne = / abc * / i;
var expTwo = RegExp ("abc *", "i");
Meestal wordt de eerste methode gebruikt. In het tweede geval worden aanhalingstekens gebruikt. Om het teken "" te gebruiken, moet het volgens de algemene regels worden ontsnapt.
"i" is een vlag die aangeeft "hoofdletter is niet belangrijk". U kunt ook vlaggen "g" - "globaal zoeken" en "m" - zoeken op meerdere regels gebruiken.
Het "/" -symbool wordt meestal gebruikt om een patroon aan te duiden.
Reguliere expressie begin en einde
Het "^" -teken identificeert het (de) teken (s) waarvande reguliere expressie begint, en de "$" specificeert welk (e) karakter (s) aan het einde moeten staan. Je moet er niet mee experimenteren binnen de uitdrukking, ze hebben daar een andere betekenis.
Bijvoorbeeld
var eRegExp = nieuwe RegExp (cRegExp, "i");
var cRegRes = "";
var sTest = "AbcZ";
if (eRegExp.test (sTest)) {
cRegRes + = "- Ja";
} anders {
cRegRes + = "- Nee";
}
var dTestLine = document.getElementById ("scTestLine");
dTestLine.innerHTML = "Expression /" + cRegExp + "/ voor de regel" "+ sTest +" "" + cRegRes.
Het "scTestLine" -element bevat het resultaat (de cRegExp-variabele heeft de overeenkomstige waarde):
uitdrukking / ^ AbcZ $ / voor string "abcz" - Ja
Als we de vlag "i" verwijderen, is het resultaat:
expressie / ^ AbcZ $ / voor string "abcz" - Nee
Reguliere expressie-inhoud
Een reguliere expressie is een reeks tekens waarnaar wordt gezocht. De / qwerty / uitdrukking zoekt naar een voorkomen van deze exacte reeks:
expression / qwerty / voor string "qwerty" - Ja
expression / qwerty / voor string "123qwerty456" - Ja
Het symbool "^" verandert de essentie van de uitdrukking:
expression / ^ qwerty / voor string "123qwerty456" - Nee
expression / ^ qwerty / voor string "qwerty456" - Ja
Evenzo voor het teken aan het einde van de regel.Reguliere expressies staan reeksen toe: bijvoorbeeld [a-z], [A-Z], [0-9] - alle letters van het Latijnse alfabet in het opgegeven hoofdlettergebruik of de opgegeven cijfers. Russische letters mogen ook worden gebruikt, maar let op de codering van de strings (waar wordt er naar gezocht, waarnaar wordt gezocht) en de pagina. Vaak hebben Russische letters, net als speciale tekens, de voorkeur om codes op te geven.
Bij het vormen van een reguliere expressie is dat mogelijkgeef opties aan voor de aanwezigheid van bepaalde karakters op een bepaalde plaats, terwijl hun aantal als volgt is ingesteld: "*" = herhaling van 0 of meer keer; "+" = herhaling van 1 of meer keren; {1,} is hetzelfde als "+"; {n} = herhaal exact n keer; {n,} = herhaal n of meer keer; {n, m} = herhaal n tot m keer.
Met vierkante haken kunt u specificerenvarianten van het symbool uit de set. Het ziet er zo uit. [abcd] = [a-d] = een van de vier tekens: "a", "b", "c" of "d". Het tegenovergestelde kan worden aangegeven. Elk ander teken dan gespecificeerd in de set: [^ abcd] = elk ander teken dan "a", "b", "c" of "d". "?" geeft aan dat het personage mogelijk niet aanwezig is op deze locatie. "." definieert elk ander teken dan een line feed. Ze zijn "n", "r", "u2028" of "u2029". De uitdrukking "s * | S *" = "[s | S] *" betekent zoeken naar een willekeurig teken, inclusief nieuwe regels.
Vereenvoudigde reguliere expressies
De uitdrukking "[s | S] *" - zoek naar een spatie of de afwezigheid ervan, dat wil zeggen, alles wat in de string staat. In dit geval betekent de notatie "s" een spatie, en "S" - de afwezigheid ervan.
Op dezelfde manier kunt u "d" gebruiken om een decimaal cijfer te zoeken en "D" om een niet-cijferig teken te zoeken. De aanduidingen "f", "r" en "n" komen overeen met form-feed, wagenretour en line-feed.
Tabteken is "t", verticaal - "v". De aanduiding "w" komt overeen met elk teken van het Latijnse alfabet (letters, cijfers, onderstrepingsteken) = [A-Za-z0-9_].
De "W" -notatie is gelijk aan [^ A-Za-z0-9_]. Dit betekent elk teken dat geen Latijnse letter, cijfer of "_" -teken is.
Zoeken naar teken "" = zoeken naar een NUL-teken. Zoek naar "xHH" of "uHHHH" = zoek naar teken met respectievelijk code HH of HHHH. H is een hexadecimaal cijfer.
Aanbevolen formulering en codering van regex
Het is belangrijk om elke reguliere expressie zorgvuldig te testen op verschillende stringvarianten.
Met ervaring in het maken van fouten in reguliere expressieszal minder zijn, maar niettemin moet u altijd in gedachten houden dat uw eigen kennis van de regels voor het schrijven van een reguliere expressie mogelijk niet overeenkomt met de werkelijkheid, vooral wanneer de "reguliere" wordt overgezet van de ene taal naar de andere.
Kiezen tussen klassiekers (exacte aanduiding) eneen vereenvoudigde versie van de reguliere expressie, is het beter om de eerste te verkiezen. In de klassiekers wordt namelijk altijd duidelijk aangegeven wat er gezocht wordt en hoe. Als er Russische letters in de reguliere expressie of in de zoekreeks staan, moeten alle tekenreeksen en de pagina waarop de JavaScript-code die de reguliere expressie uitvoert, worden geconverteerd naar een enkele codering.
Bij het verwerken van tekens die niet tot het Latijnse alfabet behoren, is het zinvol om te overwegen de codes van de tekens aan te geven, en niet de tekens zelf.
Bij het implementeren van zoekalgoritmen in JavaScript, moet de reguliere expressie zorgvuldig worden gecontroleerd. Het is vooral belangrijk om de tekencodering te regelen.
Haakjes in reguliere expressies
De vierkante haken geven de varianten van het symbool aan,die wel of niet op een bepaalde plaats zouden moeten staan, en de ronde zijn sequentievarianten. Maar dit is slechts een algemene regel. Hierop zijn geen uitzonderingen, maar er zijn veel verschillende toepassingen.
var cRegExp = "[a-z] *. (png | jpg | gif)";
var eRegExp = nieuwe RegExp (cRegExp, "i");
var cRegRes = "";
var sTest = "picture.jpg";
if (eRegExp.test (sTest)) {
cRegRes + = "- Ja";
} anders {
cRegRes + = "- Nee";
}
Resultaten:
expression / [a-z] *. (png | jpg | gif) / voor de regel "picture.jpg" - Ja
expression /^^^^^^^^*.(png\jpg|gif)/ voor de string "picture.jpg" - Nee
expression /^^^^^^^^*.(png|jpg|gif)/ voor de string "apicture.jpg" - Ja
expression /^^^^^^^*.(png|jpg|gif)/ voor de string "apicture.jg" - Nee
Merk vooral op dat alles gevolgd door een asterisk nul keer aanwezig kan zijn. Dit betekent dat de "gewone" in ieder geval op de meest onverwachte manier kan werken.
RegExp-controle - e-mailtesten
In JavaScript krijgen reguliere expressies twee methoden, test en exec, en kunnen ze worden gebruikt op String-objecten in hun methoden (functies): zoeken, splitsen, vervangen en matchen.
De testmethode is al gedemonstreerd, hiermee kunt u de juistheid van een reguliere expressie controleren. Methode resultaat: waar / onwaar.
Beschouw de volgende reguliere JavaScript-expressies. E-mailverificatie uit "moeilijk, maar nauwkeurig":
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,})) $ /;
voor de regel var sTest = "[email protected]" geeft true, dat wil zeggen, deze regel is een geldig e-mailadres. De test is uitgevoerd met de methode eRegExp.test (sTest).
Praktisch gebruik: verwerken van e-mail
De exec-methode biedt een array op de uitvoer, roep:
var aResult = eRegExp.exec (sTest);
cRegRes = "<br/>" + aResult.length + "<br/>";
voor (var i = 0; i <aResult.length; i ++) {
cRegRes + = aResult [i] + "<br/>";
}
geeft een resultaat als dit:
9
[email protected]
Slava.Chip
Slava.Chip
.Chip
ongedefinieerd
sci.by
ongedefinieerd
sci.by
sci.
De rest van de methoden werkt op een vergelijkbare manier.Het wordt aanbevolen deze zelf te controleren. Het is aan te raden om in de praktijk te oefenen met het ontwikkelen en gebruiken van reguliere expressies; het kopiëren van de code is hier niet altijd aan te raden.
Populaire "stamgasten"
De meegeleverde JavaScript-regex voore-mail is niet de enige, er zijn veel eenvoudigere opties die er zijn. Bijvoorbeeld: / ^ [w-.] + @ [W-] +. [A-z] [2,3] $ / i. Deze optie houdt echter niet alle opties voor het vastleggen van een e-mailadres in aanmerking.
Het is zeker nodig om de ervaringen van collega's te herzien,analyseer hun voorgestelde manieren voordat u uw eigen JavaScript-reguliere expressie ontwerpt. Maar er zijn ook bepaalde moeilijkheden. Vergeet niet dat in JavaScript reguliere expressies (voorbeelden hiervan bij het kopiëren) essentiële tekens kunnen dupliceren: "", "/" of aanhalingstekens. Dit zal leiden tot een fout die lang kan worden gezocht.
Het is belangrijk om rekening te houden met het bekende "menselijke aspect".Een formele JavaScript-reguliere expressie voor een telefoon die een bezoeker (mens) kan zijn, kan immers op verschillende manieren worden gespecificeerd: 123-45-67, (29) 1234567, 80291234567 of +375291234567. En het is allemaal hetzelfde nummer. De mogelijkheid om meerdere sjablonen te schrijven is niet altijd acceptabel, en een rigide vastlegging van de regel voor het schrijven van het nummer kan onnodig ongemak of beperkingen veroorzaken. Choice / ^ d [d () -] {4,14} d $ / i is geschikt voor de meeste gevallen van telefoonnummerverificatie.
Als u regelmatig JavaScript moet opstellenuitdrukkingen die alleen getallen controleren, dan vereist zelfs zo'n eenvoudig geval verduidelijking. Het moet rekening houden met een geheel getal of een fractionele, exponentiële notatie of een normaal, positief of negatief getal. U kunt ook rekening houden met de aanwezigheid van een valutasymbool, het aantal cijfers achter de komma en de verdeling van het gehele deel van het getal in drieklanken.
De uitdrukking / ^ d + $ / i controleert alleen cijfers, en met de uitdrukking /^d+.d+$/i kunt u een punt gebruiken om het fractionele deel van een getal aan te geven.
In JavaScript kan regex-validatieworden gebruikt om het formaat van de ingevoerde gegevens strikt aan te geven, wat met name belangrijk is bij het invoeren van vragenlijsten, paspoortgegevens, wettelijke adressen, enz.
Datumvalidatie - het is eenvoudig
Laten we eens kijken naar reguliere JavaScript-expressies.Voorbeelden voor een datum, zoals een nummer of een telefoonnummer, vertegenwoordigen een keuze tussen starheid en flexibiliteit. De datum van het evenement is een van de essentiële gegevens die u vaak moet invullen. Maar het vastleggen van de invoer in een specifiek formaat: "dd-mm-jjjj" of "dm.jjj" leidt vaak tot ontevreden klanten. De overgang van het invoerveld van de dag naar de maand, uitgevoerd in het klassieke HTML-formulier, vindt mogelijk niet plaats als u slechts één cijfer invoert, en het invoeren van het tweede kan problemen opleveren. 3 was bijvoorbeeld al ingevoerd in het dagveld en het volgende cijfer 2 vervangt niet het eerste, en 32 is eraan toegewezen, wat natuurlijk ongemak veroorzaakt.
Efficiëntie en gemak van reguliere expressieszijn sterk afhankelijk van de algemene opbouw van de dialoog met de bezoeker. In het ene geval is het raadzaam om het ene invoerveld van het formulier te gebruiken om de datum aan te geven, in het andere geval moet u verschillende velden opgeven voor de dag, de maand en het jaar. Maar dan komen er extra "codekosten" bij het controleren van het schrikkeljaar, het aantal maanden, het aantal dagen daarin.
Vervanging zoeken, regex-geheugen
JavaScript vervangen (reguliere expressies)gebruik een methode van een String-object en laat u een waarde vinden en deze meteen wijzigen. Dit is handig voor het corrigeren van typefouten, het bewerken van de inhoud van formuliervelden en voor het converteren van gegevens van het ene presentatieformaat naar het andere.
var cRegExp = / ([a-z] +) s ([a-z] +) s ([a-z] +) / i; // er worden drie "variabelen" gemaakt tijdens het zoeken
var sTest = "dit artikel is goed!";
var cRegRes = sTest.replace (cRegExp, "$ 2, $ 3, $ 1");
var dTestLine = document.getElementById ("scTestLine");
dTestLine.innerHTML = "Expression" + cRegExp + "voor de regel" "+ sTest +" "zal zijn:" + cRegRes;
Resultaat:
uitdrukking / ([a-z] +) s ([a-z] +) s ([a-z] +) / i voor de regel "dit artikel is goed!" get: artikel, goed, deze!
Wanneer uitgevoerd, slaat elk paar haakjes het resultaat op in de "variabele" $ n, waarbij n het nummer is van het paar haakjes ($ 1, $ 2, ...). In tegenstelling tot de algemeen aanvaarde, wordt hier de nummering van variabelen uitgevoerd vanaf 1, en niet vanaf 0.
Algemene aanbevelingen
De regex vereenvoudigt de code, maar de tijd ishet ontwerp is vaak van belang. U kunt beginnen met eenvoudige constructies en vervolgens wat is gedaan combineren in meer complexe uitdrukkingen. U kunt verschillende online regex-validatieservices of speciale lokale tools gebruiken.
De beste optie is om uw eigen te makenbibliotheken met reguliere expressies en onze eigen tool voor het controleren van nieuwe ontwerpen. Dit is de beste manier om voort te bouwen op de ervaring en te leren hoe u snel betrouwbare en comfortabele ontwerpen kunt maken.
Door herhalingen van tekens en regels te gebruiken, d.w.z.de speciale tekens "*", "+" en accolades die het aantal herhalingen aangeven, moeten worden geleid door de principes van eenvoud en opportuniteit. Het is belangrijk om te begrijpen dat een reguliere expressie volledig is overgeleverd aan de gebruikte browser-engine vanaf het moment dat deze begint te werken totdat het resultaat is verkregen. Niet alle JavaScript-talen zijn gelijk gemaakt. Elke browser kan zijn eigen persoonlijke voorkeur meebrengen voor de interpretatie van reguliere expressies.
Compatibiliteit gaat niet alleen over pagina's en tabellenstijlen, het heeft ook te maken met reguliere expressies. Een pagina die JavaScript gebruikt, kan alleen als foutopsporing worden beschouwd als deze met succes in verschillende browsers is uitgevoerd.
JavaScript, String en RegExp
Werk op klantniveau, dat wil zeggen inde browser van de bezoeker in JavaScript vereist hoge kwalificaties van de ontwikkelaar. Heel lang geleden werd het mogelijk om JavaScript-code te debuggen met uw eigen browsertools of met extensies van derden, code-editors en onafhankelijke programma's.
De debugger kan dat echter niet in alle gevallenbeheren en de ontwikkelaar voorzien van goede ondersteuning, snelle foutdetectie, detectie van bottlenecks. De dagen dat de computer zich op computers concentreerde, liggen in een ver verleden. De focus ligt nu op informatie, en string-objecten spelen een essentiële rol. Getallen zijn snaren geworden en ze manifesteren hun ware essentie alleen op het juiste moment en op de juiste plaats.
Reguliere expressies vergroten de mogelijkheden van strings, maar vereisen het juiste respect voor zichzelf. Debuggen van RegExp terwijl het wordt uitgevoerd, zelfs als het mogelijk is om het te simuleren, is geen erg interessant idee.
Inzicht in de structuur en logica van het RegExp-object, de betekenis van het String-object, de syntaxis en semantiek van JavaScript is een zekere garantie voor veilige en betrouwbare code, stabiele werking van elke pagina en de site als geheel.