/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
JavaScript form validering - regexp
Fra : Kasper Vibe Grevsen


Dato : 24-08-03 17:20

Hejsa,

jeg har nu været ved at læse om regulære udtryk og match og replace i
JavaScript,
men kan ikke rigtigt forstå hvordan de fungerer.

Jeg har en tekstboks

<INPUT TYPE="TEXTAREA" NAME="adresse">

og vil gerne sikre mig:

1. Der indtastes netop tre linjer
2. Hver linje består af mindst to ord
3. Anden linje indeholder mindst et tal
4. Tredje linje indeholder et firecifret tal

Til en anden opgave vil jeg gerne udskifte alle mellemrum med + i en
tekststreng.


Jeg vil blive meget glad for lidt hjælp og en lille
forklaring til hvordan udtrykkene virker.


--
mvh Kasper Grevsen
www.unlockaarhus.dk



 
 
Lasse Reichstein Nie~ (24-08-2003)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 24-08-03 18:02

"Kasper Vibe Grevsen" <kaspervg@mail1.NOCAPSstofanet.dENMARk> writes:

> Jeg har en tekstboks
....
> og vil gerne sikre mig:

Lad os omskrive til noget der handler om tegn. Det er det regulære
udtryk arbejder med.

> 1. Der indtastes netop tre linjer

Indeholder præcist to interne linjeskift (evt. et til sidst).

> 2. Hver linje består af mindst to ord

Hver linje indeholder mindst et whitespace med bogstaver på begge sider.
(hvad mener du præcist med "ord"? Er "777" et ord?)

> 3. Anden linje indeholder mindst et tal

Anden linje indeholder et ord der netop består af et eller flere cifre.

Mener du tal eller ciffer?

> 4. Tredje linje indeholder et firecifret tal

Den er ligetil.

Dette ville jeg ikke gøre med *et* regulært udtryk. Man kan godt, men
det er nemmere at dele opgaven lidt op.


Lad os prøve alligevel:

Første linje: Mindst to ord, ikke andre krav.
Regulært udtryk: [^\n]*[^\n\s]\s+[^\n\s][^\n]*
Forklaring: minst to tegn der ikke er mellemrum med mellerum imellem,
og ingen linjeskift. Opdelt som:
måske nogle ikke-linjeskift : [^\n]*
et ikke-mellerum/linjeskift : [^\n\s]
nogle mellemrum : \s+
et ikke-mellerum/linjeskift : [^\n\s]
måske nogle ikke-linjeskift : [^\n]*

Anden linje: Mindst to ord og mindst et tal.
Regulært udtryk:
([^\n]*\b\d+\b[^\n]*\s[^\s\n][^\n]*)|([^\n]*[^\s\n]\s[^\n]*\b\d+\b[^\n]*)
Forklaring:
De to krav (et mellemrum og et tal) kan optræde i to rækkefølger.
Der er et regulært udtryk for hver mulighed, og de er sat sammen med
"|" (enten-eller). De er symmetriske, så vi forklarer kun den første:

Måske nogle ikke-linjeskift : [^\n]*
Et ord der er et tal : \b\d+\b
Måske nogle ikke-linjeskift : [^\n]*
nogle mellemrum : \s+
et ikke-mellerum/linjeskift : [^\n\s]
måske nogle ikke-linjeskift : [^\n]*

\b betyder "word boundary", og matcher hvis tegnet før og efter
ikke begge to er bogstaver/tal (i dette tilfælde: tal)

Tredje linje: Mindst to ord og mindst et tal på præcist fire cifre.
Som anden linje, blot \d+ skiftes ud med \d{4}.

Det samlede regulære udtryk fås ved at sætte dem sammen med parenteser
om og \n'er imellem.

(undgå at din e-mail-klient wrapper linjen)
---
var re = /([^\n]*[^\n\s]\s+[^\n\s][^\n]*)\n(([^\n]*\b\d+\b[^\n]*\s[^\s\n][^\n]*)|([^\n]*[^\s\n]\s[^\n]*\b\d+\b[^\n]*))\n(([^\n]*\b\d{4}\b[^\n]*\s[^\s\n][^\n]*)|([^\n]*[^\s\n]\s[^\n]*\b\d{4}\b[^\n]*))/;
---

Du kan så teste den på forskellige strenge:

re.test("a b\n42 c\nx y 9999"); // giver "true"
re.test("a b\n42 c\nx y 999"); // giver "false"
re.test("a b\nx42 c\nx y 9999"); // giver "false" fordi "x42" ikke er et tal
re.test("ab\n42 c\nx y 9999"); // giver "false" fordi første linje er et ord

> Til en anden opgave vil jeg gerne udskifte alle mellemrum med + i en
> tekststreng.

Den er nemmere:
var x = "...streng med mellemrum..."
x.replace(/ /g,"+");

Det regulære udtryk "/ /" matcher netop et mellemrum. Vi tilføjer
"g"'et for at tillade at man matcher mere end en gang, ellers ville
vi kun udskifte det første mellemrum.

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
Art D'HTML: <URL:http://www.infimum.dk/HTML/randomArtSplit.html>
'Faith without judgement merely degrades the spirit divine.'

Lasse Reichstein Nie~ (24-08-2003)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 24-08-03 18:06

Lasse Reichstein Nielsen <lrn@hotpop.com> writes:

> ---
> var re = /([^\n]*[^\n\s]\s+[^\n\s][^\n]*)\n(([^\n]*\b\d+\b[^\n]*\s[^\s\n][^\n]*)|([^\n]*[^\s\n]\s[^\n]*\b\d+\b[^\n]*))\n(([^\n]*\b\d{4}\b[^\n]*\s[^\s\n][^\n]*)|([^\n]*[^\s\n]\s[^\n]*\b\d{4}\b[^\n]*))/;
> ---

Og så glemte jeg alligevel noget. Dette vil matche, selv hvis der er
flere linjer foran og bagefter. For at undgå det, skal man tilføje "^"
i starten og "$" i slutningen. Jeg sagde også at et linjeskift til
sidst, uden noget efter, ikke ville tælle som en fjerde linje, så
det skal også accepteres, så vi slutter med "\n?$".

---
var re = /^([^\n]*[^\n\s]\s+[^\n\s][^\n]*)\n(([^\n]*\b\d+\b[^\n]*\s[^\s\n][^\n]*)|([^\n]*[^\s\n]\s[^\n]*\b\d+\b[^\n]*))\n(([^\n]*\b\d{4}\b[^\n]*\s[^\s\n][^\n]*)|([^\n]*[^\s\n]\s[^\n]*\b\d{4}\b[^\n]*))\n?$/;
---

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
Art D'HTML: <URL:http://www.infimum.dk/HTML/randomArtSplit.html>
'Faith without judgement merely degrades the spirit divine.'

Kasper Vibe Grevsen (24-08-2003)
Kommentar
Fra : Kasper Vibe Grevsen


Dato : 24-08-03 23:01

"Lasse Reichstein Nielsen" <lrn@hotpop.com> skrev i en meddelelse
news:7k53xa4j.fsf@hotpop.com...
> "Kasper Vibe Grevsen" <kaspervg@mail1.NOCAPSstofanet.dENMARk> writes:

Hej Lasse,

tak for den fine forklaring og det hurtige svar.

Der er tale om verificering af en postadresse
derfor gælder desuden

anden linje: ord før tal
tredje linje: tal før ord

hvis jeg har forstået dig ret er det i så fald nok med

var re =
/^([^\n]*[^\n\s]\s+[^\n\s][^\n]*)\n([^\n]*[^\s\n]\s[^\n]*\b\d+\b[^\n]*)\n([^
\n]*\b\d{4}\b[^\n]*\s[^\s\n][^\n]*)\n?$/;


> Lad os prøve alligevel:
>
> Første linje: Mindst to ord, ikke andre krav.
> Regulært udtryk: [^\n]*[^\n\s]\s+[^\n\s][^\n]*

Ok, jeg havde opdaget \n og \s, men ikke tænkt på ^(not?)
Altså * betyder et antal (evt. ingen) og [] betyder en delstreng?


> Et ord der er et tal : \b\d+\b

Ok, jeg havde selv forsøgt \b(2), men det virkede ikke rigtigt.
Vil det sige at \b altid skal parres med et andet kriterium?


> Som anden linje, blot \d+ skiftes ud med \d{4}.

Ah ja.


> > Til en anden opgave vil jeg gerne udskifte alle mellemrum med + i en
> > tekststreng.
>
> Den er nemmere:
> var x = "...streng med mellemrum..."
> x.replace(/ /g,"+");

Ok, jeg tror jeg har forsøgt x.replace(" "/g,"+");
Burde det ikke have virket?


Mange tak for hjælpen.


--
Kasper



Lasse Reichstein Nie~ (25-08-2003)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 25-08-03 00:16

"Kasper Vibe Grevsen" <kaspervg@mail1.NOCAPSstofanet.dENMARk> writes:

> "Lasse Reichstein Nielsen" <lrn@hotpop.com> skrev i en meddelelse
> news:7k53xa4j.fsf@hotpop.com...
> > "Kasper Vibe Grevsen" <kaspervg@mail1.NOCAPSstofanet.dENMARk> writes:
>
> Hej Lasse,
>
> tak for den fine forklaring og det hurtige svar.
>
> Der er tale om verificering af en postadresse
> derfor gælder desuden
>
> anden linje: ord før tal
> tredje linje: tal før ord
>
> hvis jeg har forstået dig ret er det i så fald nok med
>
> var re =
> /^([^\n]*[^\n\s]\s+[^\n\s][^\n]*)\n([^\n]*[^\s\n]\s[^\n]*\b\d+\b[^\n]*)\n([^
> \n]*\b\d{4}\b[^\n]*\s[^\s\n][^\n]*)\n?$/;
>
>
> > Lad os prøve alligevel:
> >
> > Første linje: Mindst to ord, ikke andre krav.
> > Regulært udtryk: [^\n]*[^\n\s]\s+[^\n\s][^\n]*
>
> Ok, jeg havde opdaget \n og \s, men ikke tænkt på ^(not?)
> Altså * betyder et antal (evt. ingen) og [] betyder en delstreng?

* betyder ganske rigtigt "nul eller flere af det foregående". [ og ]
markerer en tegnmængde. [abc] matcher *enten* "a" eller "b" eller
"c". Det kunne også skrives som (a|b|c), men []-notationen er kortere.

Hvis man begynder en tegnmængde med "^", så virker den omvendt. Altså
[^abc] matcher alle enkelte tegn undtagen "a", "b" og "c".

Man kan også skrive sekvenser hurtigt: [a-z] matcher fra "a" til "z".

>
> > Et ord der er et tal : \b\d+\b
>
> Ok, jeg havde selv forsøgt \b(2), men det virkede ikke rigtigt.
> Vil det sige at \b altid skal parres med et andet kriterium?

\b (står for "boundary") matcher ikke et tegn. Man kan sige at
det matcher "mellemrummet" mellem to tegn, hvor det ene er et
"ord-tegn" og det andet er et whitespace.

Så /\bx/ matcher "a x", men ikke "ax", fordi der ikke er et
word-boundary før et x.

\b{2} matcher det samme some \b, da det jo ikke fylder noget,
og det andet derfor matcher på samme position som det første.

> > Den er nemmere:
> > var x = "...streng med mellemrum..."
> > x.replace(/ /g,"+");
>
> Ok, jeg tror jeg har forsøgt x.replace(" "/g,"+");
> Burde det ikke have virket?

Nej. Man kan ikke dividere (/) en streng (" ") med en ikke-deklareret
variabel (g). Et regulært udtryk skrives mellem to /'er og evt. med
nogle bogstaver bagefter. Bare at tilføje "/g" betyder ikke at en
streng kan matcher mere end en gang.

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
Art D'HTML: <URL:http://www.infimum.dk/HTML/randomArtSplit.html>
'Faith without judgement merely degrades the spirit divine.'

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408927
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste