212 votes

Le moyen le plus rapide pour vérifier une chaîne contient une autre sous-chaîne de caractères en Javascript?

Je suis en train de travailler avec un problème de performance sur le Javascript. Donc, je veux juste vous demander: quel est le moyen le plus rapide de vérifier si une chaîne contient une autre sous-chaîne (j'ai juste besoin de la valeur de type boolean)? Pourriez-vous s'il vous plaît suggérer votre idée et de l'échantillon extrait de code?! Merci beaucoup!

370voto

Felix Kling Points 247451

Vous avez deux possibilités:

  1. Expression régulière:

    (new RegExp('word')).test(str)
    // or
    /word/.test(str)
    
  2. indexOf:

    str.indexOf('word') !== -1
    

Les expressions régulières semblent être plus rapide (au moins en Chrome 10).

Test de Performance - courte botte de foin
Test de Performance au long de la botte de foin

Mise à jour:

On ne peut pas dire avec certitude quelle méthode est la plus rapide. Les différences entre les navigateurs est énorme. Alors que dans google Chrome, 10 indexOf semble être plus rapide, Safari 5, indexOf est nettement plus lent que toute autre méthode.

Vous devez voir et l'essayer pour votre auto. Cela dépend de vos besoins. Par exemple, un de la casse de la recherche est plus rapide avec des expressions régulières.

18voto

Stephen Chung Points 9467

Cela fonctionne pour vous?

string1.indexOf(string2) >= 0

Edit: Cela ne peut pas être plus rapide qu'une RegExp si la chaîne2 contient de motifs répétés. Sur certains navigateurs, indexOf peut être beaucoup plus lent que la RegExp. Voir les commentaires.

Edit 2: RegExp peut être plus rapide que indexOf lorsque les chaînes sont très longues et/ou contiennent des motifs répétés. Voir les commentaires et @Felix réponse.

7voto

wpg4665 Points 70

J'ai trouvé que l'utilisation d'une simple boucle for, itérer sur tous les éléments de la chaîne et en la comparant à l'aide de charAt effectue plus rapidement qu' indexOf ou Regex. Le code et la preuve est disponible à JSPerf.

ETA: indexOf et charAt effectuer de la même façon terrible sur Chrome Mobile selon les navigateurs Portée de données figurant sur jsperf.com

4voto

Anton Danilchenko Points 1012

Il est facile à utiliser .match() méthode de chaîne de caractères.

var re = /(AND|OR|MAYBE)/;
var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
console.log('Do we found something?', Boolean(str.match(re)));

Vous souhaite une bonne journée, monsieur!

3voto

Chii Points 7798

Pour trouver une simple chaîne de caractères, à l'aide de la méthode indexOf() et en utilisant les regex est à peu près la même: http://jsperf.com/substring - afin de choisir celui qui semble le plus facile à écrire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X