Comment puis-je vérifier si une chaîne se termine par un caractère particulier en JavaScript?
Exemple: j'ai une chaîne
var str = "mystring#";
Je veux savoir si cette chaîne se termine par #
. Comment puis-je le vérifier?
Existe-t-il une
endsWith()
méthode en JavaScript?Une solution que j'ai est de prendre la longueur de la chaîne et d'obtenir le dernier caractère et de le vérifier.
Est-ce le meilleur moyen ou existe-t-il un autre moyen?
javascript
string
ends-with
Bobby Kumar
la source
la source
String.prototype.endsWith
.Réponses:
MISE À JOUR (24 novembre 2015):
Cette réponse a été initialement publiée en 2010 (SIX ans en arrière). Veuillez donc prendre note de ces commentaires perspicaces:
Shauna - Mise à jour pour Googlers - On dirait que ECMA6 ajoute cette fonction. L'article MDN montre également un polyfill. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
TJ Crowder - La création de sous-chaînes n'est pas chère sur les navigateurs modernes; c'était peut-être en 2010 lorsque cette réponse a été publiée. De nos jours, l'
this.substr(-suffix.length) === suffix
approche simple est la plus rapide sur Chrome, la même sur IE11 que indexOf, et seulement 4% plus lente (territoire fergetaboutit) sur Firefox: jsperf.com/endswith-stackoverflow/14 Et plus rapide dans tous les cas lorsque le résultat est faux: jsperf.com/endswith-stackoverflow-when-false Bien sûr, avec ES6 ajoutant des finsAvec, le point est sans objet. :-)RÉPONSE ORIGINALE:
Je sais que c'est une question vieille d'un an ... mais j'en ai aussi besoin et j'en ai besoin pour travailler sur plusieurs navigateurs donc ... en combinant la réponse et les commentaires de chacun et en simplifiant un peu:
indexOf
fonction native pour des résultats plus rapidesindexOf
pour avancerDe plus, si vous n'aimez pas bourrer les choses dans les prototypes de la structure de données native, voici une version autonome:
EDIT: Comme indiqué par @hamish dans les commentaires, si vous voulez vous tromper et vérifier si une implémentation a déjà été fournie, vous pouvez simplement ajouter une
typeof
vérification comme ceci:la source
this.substr(-suffix.length) === suffix
approche simple est la plus rapide sur Chrome, la même sur IE11 queindexOf
, et seulement 4% plus lente (territoire fergetaboutit) sur Firefox: jsperf.com/endswith-stackoverflow/14 Et plus rapide dans tous les cas lorsque le résultat est faux: jsperf .com / endswith-stackoverflow-when-false Bien sûr, avec l'ajout d'ES6endsWith
, le point est sans objet. :-)fonctionnera sur tous les navigateurs, ne nécessite pas de correction de singe
String
et ne nécessite pas d'analyser la chaîne entière commelastIndexOf
il n'y a pas de correspondance.Si vous souhaitez faire correspondre une chaîne constante qui peut contenir des caractères spéciaux d'expression régulière, tels que
'$'
, vous pouvez utiliser les éléments suivants:et vous pouvez l'utiliser comme ceci
la source
lastIndexOf
analyse la chaîne entière uniquement si elle ne trouve aucune correspondance, ou trouve une correspondance au début. S'il y a une correspondance à la fin, cela fonctionne proportionnellement à la longueur du suffixe. Oui,/asdf$/.test(str)
donne vrai quandstr
se termine par"asdf"
.if( "mystring#".substr(-1) === "#" ) {}
la source
slice()
? Cela fonctionne pour moi dans mon test rapide IE7.Allez, c'est la bonne
endsWith
mise en œuvre:l'utilisation
lastIndexOf
crée simplement des boucles CPU inutiles s'il n'y a pas de correspondance.la source
===
cependant.Cette version évite de créer une sous-chaîne et n'utilise pas d'expressions régulières (certaines réponses d'expression régulière fonctionneront ici, d'autres sont cassées):
Si les performances sont importantes pour vous, il vaudrait la peine de vérifier si
lastIndexOf
sont réellement plus rapides que la création d'une sous-chaîne ou non. (Cela peut dépendre du moteur JS que vous utilisez ...) Cela peut être plus rapide dans le cas correspondant, et lorsque la chaîne est petite - mais lorsque la chaîne est énorme, elle doit regarder en arrière, même mais on s'en fout vraiment :(Pour vérifier un seul caractère, trouver la longueur puis l'utiliser
charAt
est probablement le meilleur moyen.la source
str+"$"
comme expression régulière sont brisées, car elles peuvent ne pas être des expressions régulières valides.Je n'ai pas vu d'approches avec la
slice
méthode. Je laisse donc ça ici:la source
ne fonctionne pas dans le cas où la longueur de la chaîne d'origine est inférieure de un à la longueur de la chaîne de recherche et la chaîne de recherche est introuvable:
lastIndexOf renvoie -1, puis vous ajoutez la longueur de la chaîne de recherche et vous vous retrouvez avec la longueur de la chaîne d'origine.
Une solution possible est
la source
De developer.mozilla.org String.prototype.endsWith ()
Sommaire
La
endsWith()
méthode détermine si une chaîne se termine par les caractères d'une autre chaîne, renvoyant vrai ou faux selon le cas.Syntaxe
Paramètres
searchString : les caractères à rechercher à la fin de cette chaîne.
position : Rechercher dans cette chaîne comme si cette chaîne n'était que longue; par défaut, la longueur réelle de cette chaîne, fixée dans la plage établie par la longueur de cette chaîne.
La description
Cette méthode vous permet de déterminer si une chaîne se termine ou non par une autre chaîne.
Exemples
Caractéristiques
ECMAScript Language Specification 6th Edition (ECMA-262)
Compatibilité du navigateur
la source
-- Ou --
la source
J'espère que ça aide
la manière traditionnelle
la source
Je ne sais pas pour vous, mais:
Pourquoi des expressions régulières? Pourquoi jouer avec le prototype? substr? Allons y...
la source
Juste une autre alternative rapide qui a fonctionné comme un charme pour moi, en utilisant regex:
la source
Si vous utilisez lodash :
Si vous n'utilisez pas lodash, vous pouvez emprunter à sa source .
la source
Je viens d'apprendre cette bibliothèque de chaînes:
http://stringjs.com/
Incluez le fichier js, puis utilisez la
S
variable comme ceci:Il peut également être utilisé dans NodeJS en l'installant:
Le nécessitant ensuite comme
S
variable:La page Web contient également des liens vers d'autres bibliothèques de chaînes, si celle-ci ne vous convient pas.
la source
la source
Tant de choses pour un si petit problème, utilisez simplement cette expression régulière
la source
Cela fait de nombreuses années pour cette question. Permettez-moi d'ajouter une mise à jour importante pour les utilisateurs qui souhaitent utiliser la réponse du chakrit la plus votée.
Les fonctions 'endsWith' sont déjà ajoutées à JavaScript dans le cadre d'ECMAScript 6 (technologie expérimentale)
Référez-le ici: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
Par conséquent, il est fortement recommandé d'ajouter une vérification de l'existence d'une implémentation native comme mentionné dans la réponse.
la source
la source
Un moyen de pérenniser et / ou d'empêcher l'écrasement du prototype existant serait de vérifier le test pour voir s'il a déjà été ajouté au prototype String. Voici mon point de vue sur la version très appréciée non regex.
la source
if (!String.prototype.hasOwnProperty("endsWith"))
est la meilleure façon. Avectypeof
, "MooTools et certaines autres bibliothèques AJAX vont vous gâcher", selon "Crockford on JavaScript - Level 7: ECMAScript 5: The New Parts", à 15:50 min.La réponse acceptée de @ chakrit est un moyen solide de le faire vous-même. Si, cependant, vous recherchez une solution packagée, je vous recommande de jeter un œil à underscore.string , comme l'a souligné @mlunoe. En utilisant underscore.string, le code serait:
la source
si vous ne voulez pas utiliser lasIndexOf ou substr, alors pourquoi ne pas simplement regarder la chaîne dans son état naturel (c'est-à-dire un tableau)
ou en tant que fonction autonome
la source
la source
Après tout ce long décompte de réponses, j'ai trouvé ce morceau de code simple et facile à comprendre!
la source
Ceci est la mise en œuvre de endsWith:
String.prototype.endsWith = function (str) { return this.length >= str.length && this.substr(this.length - str.length) == str; }
la source
Il s'agit de la mise en œuvre de
endsWith
:la source
Cela s'appuie sur la réponse acceptée de @ charkit permettant à un tableau de chaînes ou à une chaîne de passer en argument.
Cela nécessite des traits de soulignement - mais peut probablement être ajusté pour supprimer la dépendance de soulignement.
la source
_.str.endsWith
Avantages:
la source
N'utilisez pas d'expressions régulières. Ils sont lents même dans les langues rapides. Écrivez simplement une fonction qui vérifie la fin d'une chaîne. Cette bibliothèque a de bons exemples: groundjs / util.js . Soyez prudent en ajoutant une fonction à String.prototype. Ce code a de bons exemples de comment le faire: groundjs / prototype.js En général, c'est une belle bibliothèque au niveau du langage: groundjs Vous pouvez également jeter un œil à lodash
la source
tous sont des exemples très utiles. Ajouter
String.prototype.endsWith = function(str)
nous aidera à simplement appeler la méthode pour vérifier si notre chaîne se termine par ou non, bien regexp le fera également.J'ai trouvé une meilleure solution que la mienne. Merci tout le monde.
la source
Pour coffeescript
la source