Toon posts:

[JS] RegExp - Meerdere woorden uit een string filteren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Is het mogelijk om met reguliere expressies in JS een aantal keer een bepaald woord uit een string te filteren? Bijvoorbeeld alle "bc's" uit de string: abcabcabc?

Zelf heb ik het op de volgende manier proberen voor elkaar te krijgen:
JavaScript:
1
2
3
var sTest = 'abcabcabc';

alert(/(^[\bc]+$)/ig.exec(sTest).join(', '));

[ Voor 47% gewijzigd door Verwijderd op 05-06-2004 20:30 ]


Verwijderd

Wat dacht je van:

code:
1
2
3
4
5
<script type="text/javascript">
  var sTest = 'abcabcabc';
  sTest = sTest.replace(/bc/gi, "");
  alert(sTest);
</script>

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:54

crisp

Devver

Pixelated

edit: forget it, I wasn't thinking :P

exec() matched maar 1x per call en verschuift daarbij de cursor in de string; je hebt dus een loop nodig zoals ik in mijn volgende post laat zien :)

[ Voor 84% gewijzigd door crisp op 06-06-2004 00:58 ]

Intentionally left blank


Verwijderd

Topicstarter
Ok. Dat werkt inderdaad, maar hoe verkrijg ik nu alle "bc's" als een resultaatarray? Dus alle drie de "bc's" die in de string voorkomen. -> sResult(bc, bc, bc)

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:54

crisp

Devver

Pixelated

Verwijderd schreef op 06 juni 2004 @ 00:30:
Ok. Dat werkt inderdaad, maar hoe verkrijg ik nu alle "bc's" als een resultaatarray? Dus alle drie de "bc's" die in de string voorkomen. -> sResult(bc, bc, bc)
er is niet zoiets als een match_all in js, dus je zal een loop moeten gebruiken:
JavaScript:
1
2
3
4
var sTest = 'abcabcabc';
var sResult = [], tmpResult, i = 0;
var re = /bc/ig;
while ((tmpResult = re.exec(sTest)) !== null) sResult[i++] = tmpResult;


edit: je kan wel de replace misbruiken bedenk ik me net:

JavaScript:
1
2
3
4
5
var sTest = 'abcabcabc';
var sResult = [], i = 0;
var re = /bc/ig;
sTest.replace(re, function($0){sResult[i++]=$0});
alert(sResult);


beetje smerig en ws is de loop toch sneller :P

[ Voor 22% gewijzigd door crisp op 06-06-2004 00:59 ]

Intentionally left blank


Verwijderd

Topicstarter
Ok. Hardstikke bedankt voor het antwoord. Jammer dat JS dan geen match all o.i.d. kent..

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 13:27
Verwijderd schreef op 06 juni 2004 @ 14:44:
Ok. Hardstikke bedankt voor het antwoord. Jammer dat JS dan geen match all o.i.d. kent..
Je kunt met de code van crisp die functie natuurlijk erg handig zelf toevoegen...

Verwijderd

Topicstarter
Ok. In het kader 'verrijk het archief' hier dus mijn uiteindelijke functie om meerdere searches te matchen en terug te geven.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function RegExpMatchAll(sIptPattern, sIptSubject)
{
    var sPattern = /^\/(.+?)\/.*$/.exec(sIptPattern)[1];
    var sFlags = /^\/.+?\/.*?(i|).*$/.exec(sIptPattern)[1];
    
    var iRegExp = new RegExp(sPattern, sFlags + 'g');
    var sResult = new Array();
    var i = 0;
    
    while ((sTempResult = iRegExp.exec(sIptSubject)) !== null) 
    { 
        for (j in sTempResult)
        {
            if (/[1-9]+/.test(j) && ! /^undefined+$/.test(sTempResult[j]))
            { 
                sResult[i] = sTempResult[j];
                i++;
                
                break;
            }
        }
    }

    return(sResult);
}

var sTest = RegExpMatchAll('/(blaat)|(bloot)/', 'blaatblootblaat');
Pagina: 1