2010-05-25 5 views
0

Dans Actionscript et Adobe Flex, j'utilise un motif et une expression rationnelle (avec le drapeau global) avec la méthode string.match et cela fonctionne comme je le souhaite sauf quand la correspondance retourne plusieurs occurrences du même mot dans le texte . Dans ce cas, toutes les correspondances pour ce mot pointent uniquement vers l'index pour la première occurrence de ce mot. Par exemple, si le texte est "chat chien chat chat vache" et que le motif est une recherche de cat *, la méthode match renvoie un tableau de trois occurrences de "chat", cependant, ils pointent tous vers l'index du premier chat apparition de chat quand j'utilise indexOf sur une boucle à travers le tableau. Je suppose que c'est juste comme la méthode string.match est (bien que s'il vous plaît laissez-moi savoir si je fais quelque chose de mal ou de manquer quelque chose!). Je veux trouver les indices spécifiques de chaque occurrence d'une correspondance, même s'il s'agit d'un mot qui a déjà été trouvé.Comment utiliser la méthode string.match pour trouver plusieurs occurrences du même mot dans une chaîne?

Je me demande si c'est exactement la méthode string.match et si c'est le cas, si quelqu'un a une idée de la meilleure façon de le faire. Merci.

Répondre

2

Le problème est pas avec la méthode match, il est avec les indexOf method

function indexOf(val:String, startIndex:Number = 0):int 

Recherche la chaîne et renvoie la position de la première occurrence de val trouvé à ou après startIndex dans la chaîne d'appel.

Vous devez appeler indexOf avec startIndex approprié - en d'autres termes, vous avez pour commencer la recherche à partir de la fin du match précédent.

var s:String = "cats dog cat cats cow cat"; 
var matches:Array = s.match(/cats?/g); 
trace(matches.join());// ["cats", "cat", "cats", "cat"] 
var k:Number = 0; 
for(var i:Number = 0; i < matches.length; i++) 
{ 
    k = s.indexOf(matches[i], k); 
    trace("match #" + i + " is at " + k); 
    k += matches[i].length; 
} 

Vous pouvez aussi le faire en utilisant la méthode regex.exec:

var s:String = "cats dog cat cats cow cat"; 
var r:RegExp = /cats?/g; 
var match:Object; 
while((match = r.exec(s)) != null) 
{ 
    trace("Match at " + match.index + "\n" + 
    "Matched substring is " + match[0]); 
} 
Questions connexes