"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.'