2010-09-08 9 views
2

Pour mettre cela en contexte, tenir compte de ces 2 fonctions:Comment limiter une chaîne à un ensemble spécifique de caractères dans JavaScript?

ml_RestrictToChars = function(input,regex) { 
    var result = '';var c = ''; 
    var rx = new RegExp(regex); 
    for (var i = 0; i < input.length; i++) { 
     c = input.charAt(i); 
     if (rx.test(c)) { 
      result += c; 
     } 
    } 
    return result; 
}; 
ml_OmitChars = function(input,regex) { 
    var rx = new RegExp(regex,'g'); 
    return input.replace(rx,''); 
}; 

La première fonction limitera l'entrée à un certain jeu de caractères, le second omettre un caractère ou d'une séquence de caractères de l'entrée. Comme vous pouvez le voir par le code dans la première fonction, il ne fonctionnera que si une seule classe de caractères est passée dans l'argument 'regex' parce que le code d'inclusion ne vérifie les caractères qu'un seul à la fois.

Tenir compte de la chaîne d'entrée 12-34, maintenant si je passe une expression régulière de '[0-9]' à la première fonction et '[^0-9]' à la deuxième fonction, je vais obtenir une sortie identique comme prévu: 1234

Cependant, si je l'utilise une expression plus avancée dans la deuxième fonction comme '[^0-9][^0-9]-', j'obtiendrai une sortie de 12-. Mais si je passe plus d'une classe de caractères à la première fonction, elle retournera une chaîne vide. Ce que je me demande est s'il y a un moyen facile (de préférence sans boucle) de faire l'inverse de ml_OmitChars afin qu'ils fonctionnent de manière similaire?

+0

Pourquoi testez-vous par caractère dans vos fonctions ml_RestrictToChars? – Johan

+0

S'il n'a pas testé par caractère en utilisant cette approche, il n'y aurait aucun moyen d'exclure les caractères. C'est ce que fait la ligne if (rx.test (c)) - déterminez si chaque caractère doit être inclus dans le résultat. Je ne dis pas que c'est la seule approche du problème, et j'espérais que quelqu'un serait capable d'aborder cela d'un point de vue différent. – NightOwl888

+0

Ah, alors vous pouvez utiliser votre fonction omitchars et renvoyer le diff entre l'original et la fonction omitchars. Cela refléterait vos fonctions. – Johan

Répondre

1

La correspondance de chaque caractère est simple (mais lente), et vous montrez comment cela fonctionne. Ce que vous voulez maintenant est de faire correspondre un motif et de concaténer toutes les correspondances. Cela se fait comme ceci:

ml_RestrictToChars = function(input,regex) { 
    var rx = new RegExp (regex, 'g'); 
    var matches = input.match (rx); 
    return matches.join (''); 
}; 

La première ligne fait un regex « global », qui modifie le comportement du match(). La deuxième ligne renvoie toutes les correspondances dans un tableau et la dernière ligne les joint en une seule chaîne et les renvoie.

+0

Merci d'avoir pris le temps de réfléchir. Je pense que cela fera l'affaire. – NightOwl888