¿Cómo puedo verificar si una cadena termina con un carácter particular en JavaScript?
Ejemplo: tengo una cadena
var str = "mystring#";
Quiero saber si esa cadena termina con #
. ¿Cómo puedo verificarlo?
¿Hay algún
endsWith()
método en JavaScript?Una solución que tengo es tomar la longitud de la cadena y obtener el último carácter y verificarlo.
¿Es esta la mejor manera o hay alguna otra?
javascript
string
ends-with
Bobby Kumar
fuente
fuente
String.prototype.endsWith
.Respuestas:
ACTUALIZACIÓN (24 de noviembre de 2015):
Esta respuesta se publicó originalmente en el año 2010 (SEIS años atrás), así que tome nota de estos comentarios perspicaces:
Shauna - Actualización para Googlers - Parece que ECMA6 agrega esta función. El artículo de MDN también muestra un polyfill. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
TJ Crowder : crear subcadenas no es costoso en los navegadores modernos; bien pudo haber sido en 2010 cuando se publicó esta respuesta. En estos días, el
this.substr(-suffix.length) === suffix
enfoque simple es más rápido en Chrome, el mismo en IE11 que indexOf, y solo un 4% más lento (territorio fergetaboutit) en Firefox: jsperf.com/endswith-stackoverflow/14 Y más rápido en todos los ámbitos cuando el resultado es falso: jsperf.com/endswith-stackoverflow-when-false Por supuesto, con ES6 agregando extremosCon, el punto es discutible. :-)RESPUESTA ORIGINAL:
Sé que esta es una pregunta de hace un año ... pero también la necesito y la necesito para funcionar en varios navegadores, así que ... combinando las respuestas y comentarios de todos y simplificándola un poco:
indexOf
función nativa para obtener resultados más rápidos.indexOf
para saltar adelanteAdemás, si no le gusta rellenar cosas en los prototipos de la estructura de datos nativa, aquí hay una versión independiente:
EDITAR: como señaló @hamish en los comentarios, si desea errar en el lado seguro y verificar si ya se ha proporcionado una implementación, simplemente puede agregar una
typeof
verificación de esta manera:fuente
this.substr(-suffix.length) === suffix
enfoque simple es más rápido en Chrome, el mismo en IE11 queindexOf
, y solo un 4% más lento (fergetaboutit territorio) en Firefox: jsperf.com/endswith-stackoverflow/14 Y más rápido en todos los ámbitos cuando el resultado es falso: jsperf .com / endswith-stackoverflow-when-false Por supuesto, con ES6 agregandoendsWith
, el punto es discutible. :-)funcionará en todos los navegadores, no requiere parches de mono
String
y no requiere escanear toda la cadena como lolastIndexOf
hace cuando no hay coincidenciaSi desea hacer coincidir una cadena constante que puede contener caracteres especiales de expresión regular, como
'$'
, puede usar lo siguiente:y luego puedes usarlo así
fuente
lastIndexOf
escanea toda la cadena solo si no encuentra una coincidencia o si encuentra una coincidencia al principio. Si hay una coincidencia al final, entonces funciona proporcionalmente a la longitud del sufijo. Sí,/asdf$/.test(str)
produce verdadero cuandostr
termina con"asdf"
.if( "mystring#".substr(-1) === "#" ) {}
fuente
slice()
? Funciona para mí en mi prueba rápida de IE7.Vamos, esta es la
endsWith
implementación correcta :el uso
lastIndexOf
solo crea bucles de CPU innecesarios si no hay coincidencia.fuente
===
sin embargo.Esta versión evita crear una subcadena y no usa expresiones regulares (algunas respuestas de expresiones regulares funcionarán aquí; otras están rotas):
Si el rendimiento es importante para usted, valdría la pena probar si
lastIndexOf
es realmente más rápido que crear una subcadena o no. (Puede depender del motor JS que esté usando ...) Puede ser más rápido en el caso de coincidencia, y cuando la cadena es pequeña, pero cuando la cadena es enorme, necesita mirar hacia atrás incluso aunque realmente no nos importa :(Para verificar un solo carácter, encontrar la longitud y luego usarlo
charAt
es probablemente la mejor manera.fuente
str+"$"
como expresiones regulares están rotas, ya que pueden no ser expresiones regulares válidas.No vi apporach con
slice
método. Así que solo lo dejo aquí:fuente
no funciona en el caso de que la longitud de la cadena original sea uno menos que la longitud de la cadena de búsqueda y no se encuentre la cadena de búsqueda:
lastIndexOf devuelve -1, luego agrega la longitud de la cadena de búsqueda y queda la longitud de la cadena original.
Una posible solución es
fuente
De developer.mozilla.org String.prototype.endsWith ()
Resumen
El
endsWith()
método determina si una cadena termina con los caracteres de otra cadena, devolviendo verdadero o falso según corresponda.Sintaxis
Parámetros
searchString : los caracteres que se buscarán al final de esta cadena.
position : busca dentro de esta cadena como si esta cadena fuera tan larga; el valor predeterminado es la longitud real de esta cadena, sujeta dentro del rango establecido por la longitud de esta cadena.
Descripción
Este método le permite determinar si una cadena termina o no con otra cadena.
Ejemplos
Especificaciones
Especificación del lenguaje ECMAScript 6ta edición (ECMA-262)
Compatibilidad del navegador
fuente
O bien
fuente
espero que esto ayude
la forma tradicional
fuente
No sé sobre ti, pero:
¿Por qué expresiones regulares? ¿Por qué jugar con el prototipo? substr? vamos...
fuente
Solo otra alternativa rápida que funcionó de maravilla para mí, usando regex:
fuente
Si estás usando lodash :
Si no usa lodash, puede tomar prestado de su fuente .
fuente
Acabo de enterarme de esta biblioteca de cadenas:
http://stringjs.com/
Incluya el archivo js y luego use la
S
variable como esta:También se puede usar en NodeJS instalándolo:
Luego requiriéndolo como la
S
variable:La página web también tiene enlaces a bibliotecas de cadenas alternativas, si esta no te gusta.
fuente
fuente
Tantas cosas para un problema tan pequeño, solo use esta expresión regular
fuente
Han pasado muchos años para esta pregunta. Permítanme agregar una actualización importante para los usuarios que desean usar la respuesta de chakrit más votada.
Las funciones 'endsWith' ya están agregadas a JavaScript como parte de ECMAScript 6 (tecnología experimental)
Consulte aquí: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
Por lo tanto, se recomienda agregar una verificación de la existencia de una implementación nativa como se menciona en la respuesta.
fuente
fuente
Una forma de probar en el futuro y / o evitar la sobrescritura del prototipo existente sería la comprobación de prueba para ver si ya se ha agregado al prototipo de cadena. Aquí está mi opinión sobre la versión de alta calificación no regex.
fuente
if (!String.prototype.hasOwnProperty("endsWith"))
es la mejor manera. Contypeof
"MooTools y algunas de las otras bibliotecas AJAX lo arruinarán", según "Crockford en JavaScript - Nivel 7: ECMAScript 5: Las nuevas partes", a las 15:50 min.La respuesta aceptada de @ chakrit es una forma sólida de hacerlo usted mismo. Sin embargo, si está buscando una solución empaquetada, le recomiendo echar un vistazo a underscore.string , como señaló @mlunoe. Usando underscore.string, el código sería:
fuente
si no desea utilizar lasIndexOf o substr, ¿por qué no mirar la cadena en su estado natural (es decir, una matriz)?
o como una función independiente
fuente
fuente
Después de toda esa larga lista de respuestas, ¡encontré este código simple y fácil de entender!
fuente
Esta es la implementación de fines con:
String.prototype.endsWith = function (str) { return this.length >= str.length && this.substr(this.length - str.length) == str; }
fuente
Esta es la implementación de
endsWith
:fuente
Esto se basa en la respuesta aceptada de @ charkit que permite una matriz de cadenas o una cadena para pasar como argumento.
Esto requiere guiones bajos, pero probablemente se pueda ajustar para eliminar la dependencia de guiones bajos.
fuente
_.str.endsWith
Beneficios:
fuente
No uses expresiones regulares. Son lentos incluso en idiomas rápidos. Simplemente escriba una función que verifique el final de una cadena. Esta biblioteca tiene buenos ejemplos: groundjs / util.js . Tenga cuidado al agregar una función a String.prototype. Este código tiene buenos ejemplos de cómo hacerlo: groundjs / prototype.js En general, esta es una buena biblioteca de nivel de lenguaje: groundjs También puedes echar un vistazo a lodash
fuente
Todos ellos son ejemplos muy útiles. Agregando
String.prototype.endsWith = function(str)
nos ayudará a simplemente llamar al método para verificar si nuestra cadena termina con él o no, bueno, regexp también lo hará.Encontré una solución mejor que la mía. Gracias a todos.
fuente
Para coffeescript
fuente