Avatar billede per1291 Nybegynder
25. august 2005 - 23:31 Der er 17 kommentarer og
1 løsning

RegExp: Hvordan refere til matches ?

Antag at vi vil undersøge tekststrengen S for alle forekomster af delstrengen "a" eller "b".

S="abcade";
R=/(a|b)/g;
E=S.exec(R);

Dette vil give 2 matches.
Det første match kan jeg aflæse ved at finde værdien af
M=RegExp.$1;

men hvordan kan jeg referere til det andet (og andre)?

Hilsen Per
Avatar billede per1291 Nybegynder
25. august 2005 - 23:36 #1
Undskyld, lad mig rette:

S="aqcade";
R=/(a|b)/g;
S.exec(R);

Hilsen Per
Avatar billede roenving Novice
26. august 2005 - 00:40 #2
Hvorfor ikke kaste det direkte ind i et array:

S="abcade";
R=/(a|b)/g;
E=S.match(R);

for(i=0;E.length>i;i++){
  alert(E[i];
}
Avatar billede roenving Novice
26. august 2005 - 00:42 #3
Hrm, lidt for hurtig, så der manglede en parantes, men eksemplet viser så også, at der er 3 matches:

for(i=0;E.length>i;i++){
  alert(E[i]);
}
Avatar billede per1291 Nybegynder
26. august 2005 - 17:32 #4
Aha, den konstruktion kendte jeg ikke:

E=S.match(R);

Tak roenving, venligst læg et svar.

Men jeg havde egentlig forestillet mig at der fandtes en notation, så man kunne bede om en liste udelukkende over $1-matches (for det tilfælde at min RegExp indeholdt flere sæt runde parenteser).

Hilsen Per
Avatar billede per1291 Nybegynder
26. august 2005 - 17:54 #5
Hov - jeg havde ikke tænkt mig nok om førend min forrige kommentar.
Jeg har jo nu et array over matches - og dem kan jeg da hver for sig undersøge ved at køre min RegExp på dem! - Så problemet er fuldstændig løst...

Hilsen Per
Avatar billede roenving Novice
27. august 2005 - 00:59 #6
Har du testet konsekvenserne, for man skal lige vænne sig til måden en match returnerer med, for din teori om hvordan resultaterne ser ud, er ikke helt ved siden af !-)

Prøv f.eks.

S="abcade";
R=/[ab]/g;
E=S.match(R);

for(i=0;E.length>i;i++){
  alert(E[i]);
}

-- els velbekomme '-)
Avatar billede per1291 Nybegynder
27. august 2005 - 02:04 #7
Jeg vil bestemt nær-teste dit eksempel. - Hilsen Per
Avatar billede roenving Novice
27. august 2005 - 02:08 #8
Tak for point ;~}
Avatar billede olebole Juniormester
27. august 2005 - 02:18 #9
<ole>

Per, nu har jeg jo ikke kunne undgå at bemærke, du har smidt det store RegExp-trawl ud - og haler ind fra alle retninger. Så får man jo helt lyst til at komme forbi og aggere bifangst, selvom emnet ikke lige er, hvad du fiskede efter i denne tråd  :)

En ganske anvendelig måde at bruge back-references på (og dem har du jo haft fat i i et andet spm) er at bruge en anonym funktion til at wrappe et eller andet, du vil gøre ved det fundne. F.eks:

<script type="text/JavaScript">
var s = "abcdefghij <div>En tekst i et div</div> blabla og bla";
var R = /<div>([^<]*)<\/div>/gi;
s = s.replace(R, function($1, $2){return "<div>" + $2.toUpperCase() + " - NU I UPPERCASE :)</div>"});
alert(s)
</script>

- eller du kan arbejde videre med det fundne i en anden funktion (der måske også bruger RegExp):

<script type="text/JavaScript">
function doSomething(s) {
    var R = /t\w{3}t/g
    return s.replace(R, "kommentar");
}

var s = "abcdefghij <div>En tekst i et div</div> blabla og bla";
var R = /<div>([^<]*)<\/div>/gi;
s = s.replace(R, function($1, $2){return "<div>" + doSomething($2) + "</div>"});
alert(s)
</script>

Det er måske ikke lige de mest oplagte eksempler på brugen - men det var, hvad jeg lige kunne komme i tanker om at vise det med ... og så er det nogenlunde overskueligt  :)

/mvh
</bole>
Avatar billede olebole Juniormester
27. august 2005 - 02:22 #10
- min clairvoyant - den parapsykopatsike, chackratransenderende Miss. Sibylla von Veddinge Bakker - har netop ringet og fortalt, at der inde i hendes krystalkugle sidder en midaldrende programmør med et regulært flabet udtryk i ansigtet og taster på en replik, mens han mumler noget uforståeligt om EU, bifangster og opbrugte torskekvoter.

Jes >> Spar dig!  ;D
Avatar billede roenving Novice
27. august 2005 - 02:24 #11
Den får du senere idag !-)
Avatar billede olebole Juniormester
27. august 2005 - 02:25 #12
*ROTFLMAO*
Avatar billede roenving Novice
27. august 2005 - 02:32 #13
Sibylla von Veddinge Bakker er vist ikke en miss mere, nærmere en mrs. à la hende i fødselsdagen nytårsaften ...
Avatar billede olebole Juniormester
27. august 2005 - 02:45 #14
- dine fantasier løber af med dig, Jes!  ;D
Avatar billede per1291 Nybegynder
27. august 2005 - 02:50 #15
olebole -> Du har ret i, at jeg er meget interesseret i RegExp lige nu.
Torskekvoter er ikke en af mine interesser; men måske en af dine egne?
Dit eksempel er ikke umiddelbart gennemskueligt for mig - men jeg skal nok få det tygget igennem!

For øvrigt vil jeg AFVISE din notation
function a(b) {
doSomething()
}

... fordi den i mine øjne ikke afspejler hvor man befinder sig.

Jeg foretrækker

function a(b)
{
doSomething()
}

... fordi derved vil de krøllede parenteser stå lige over hinanden: start og slut.

Hilsen Per
Avatar billede olebole Juniormester
27. august 2005 - 04:08 #16
- hvilket gør koden totalt uoverskuelig for mig. I min verden hører start-tuborgen klart til på samme linie, som definitionen af det, den skal omkranse, står på.

Jeg var engang i Australien og tilbragte de første dage med at undre mig over, jeg hele tiden stødte frontalt ind i folk på fortorvet.
Efter et par dage gik det op for mig, at når jeg gik til højre, gik 'han' til venstre ... og så skal det det jo gå galt. Vores 'medfødte' kørselsretning berører meget andet end måden, vi aggerer på i bil eller på cykel.

For australieren og mig er der ingen tvivl om, at hver vores måde at færdes på, er den eneste naturlige - og den eneste, der giver mening og overskuelighed i vores hverdag. Ingen af os kan dog argumentere seriøst vægtigt for, hvorfor 'min' opfattelse/vane er bedre end 'din'.

Jeg kan sagtens se din logik - den duer bare ikke for mig. Måske, du kan lykkes med projektet den dag, man kan få tyggegummi og plaster mod min vane ... nok ikke før  ;o)

- og torskekvoterne var blot en 'insider' joke til roenving - og gik helt og aldeles på min egen person. Mere hvis det ikke skulle fremgå klart  :)
Avatar billede olebole Juniormester
27. august 2005 - 04:25 #17
I øvrigt kan det godt være, dette eksempel vil være en lille hjælp under 'gennemtygningen':

<script type="text/JavaScript">
var s = "abcdefghij <div>En tekst i et div</div> blabla og bla";
var R = /<div>([^<]*)<\/div>/gi;
s.replace( R, function($1, $2){alert($1+"\n"+$2)} );
</script>

- bare så du kan se, hvad der egentlig sker i den anonyme funktion. I de to back-references $1 og $2 ligger henholdsvis hele strengen, der søges efter (i $1) - og det indhold, der blev fundet udfra mønstret i parentesen (i $2).

Du skal ikke tænke på, hvad man skal have ud af at gøre sådan. Eksemplet har ingen anvendelse udover at tydeliggøre, hvordan back-references opfører sig.
Det, den anonyme funktion returnerer, bliver brugt som replace-streng - og eksemplet prøver at vise, hvordan du kan hive fat i de strenge, du finder.
Så kan du selv finde på noget, der skal gøre ved strengene, inden de returneres fra funktionen - og kan bruges af replace-metoden.

Prøv det. Så kan det være, de to andre eksempler bliver lidt lettere at forstå  ;o)
Avatar billede per1291 Nybegynder
27. august 2005 - 12:51 #18
Hæ, sjovt med din oplevelse i Australien. Jeg går altid højre om folk jeg møder - fordi jeg har iagttaget at det er sådan "man" gør (her).

Tak for supplerende studiemateriale. - Hilsen Per
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester