Como posso verificar se uma string termina com um caractere específico em JavaScript?
Exemplo: Eu tenho uma string
var str = "mystring#";
Quero saber se essa sequência está terminando com #
. Como posso verificar?
Existe um
endsWith()
método em JavaScript?Uma solução que tenho é pegar o comprimento da string e pegar o último caractere e verificar.
Essa é a melhor maneira ou existe outra maneira?
javascript
string
ends-with
Bobby Kumar
fonte
fonte
String.prototype.endsWith
.Respostas:
ATUALIZAÇÃO (24 de novembro de 2015):
Esta resposta foi originalmente publicada no ano de 2010 (SIX anos atrás). Portanto, observe estes comentários perspicazes:
Shauna - atualização para googlers - parece que o ECMA6 adiciona essa função. O artigo MDN também mostra um polyfill. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
TJ Crowder - Criar substrings não é caro em navegadores modernos; pode ter sido em 2010 quando esta resposta foi publicada. Hoje em dia, a
this.substr(-suffix.length) === suffix
abordagem simples é mais rápida no Chrome, a mesma no IE11 como indexOf, e apenas 4% mais lenta (em todo o território) no Firefox: jsperf.com/endswith-stackoverflow/14 E mais rápida quando o resultado é falso: jsperf.com/endswith-stackoverflow-when-false Obviamente, com o ES6 adicionando endsWith, o ponto é discutível. :-)RESPOSTA ORIGINAL:
Sei que essa é uma pergunta de um ano ... mas eu também preciso disso e preciso que ela funcione em vários navegadores ... combinando a resposta e os comentários de todos e simplificando um pouco:
indexOf
função nativa para obter resultados mais rápidosindexOf
para avançarAlém disso, se você não gosta de colocar coisas nos protótipos da estrutura de dados nativa, aqui está uma versão autônoma:
EDIT: Como observado por @hamish nos comentários, se você quiser errar do lado seguro e verificar se uma implementação já foi fornecida, basta adicionar uma
typeof
verificação da seguinte forma:fonte
this.substr(-suffix.length) === suffix
abordagem simples é mais rápida no Chrome, a mesma no IE11indexOf
e apenas 4% mais lenta (no território) no Firefox: jsperf.com/endswith-stackoverflow/14 E mais rápida quando o resultado é falso: jsperf .com / endswith-stackoverflow-when-false Naturalmente, com a adição do ES6endsWith
, o ponto é discutível. :-)funcionará em todos os navegadores, não requer patch de macaco
String
e não exige a verificação de toda a string, comolastIndexOf
ocorre quando não há correspondência.Se você deseja corresponder uma sequência constante que pode conter caracteres especiais de expressão regular, como
'$'
, então, você pode usar o seguinte:e então você pode usá-lo assim
fonte
lastIndexOf
varre a sequência inteira apenas se não encontrar nenhuma correspondência ou encontrar uma correspondência no início. Se houver uma correspondência no final, ela funcionará proporcionalmente à duração do sufixo. Sim,/asdf$/.test(str)
produz true quandostr
termina com"asdf"
.if( "mystring#".substr(-1) === "#" ) {}
fonte
slice()
? Funciona para mim no meu teste rápido do IE7.Vamos lá, esta é a
endsWith
implementação correta :usar
lastIndexOf
apenas cria loops desnecessários da CPU se não houver correspondência.fonte
===
embora.Esta versão evita a criação de uma substring e não usa expressões regulares (algumas respostas regex aqui funcionarão; outras estão quebradas):
Se o desempenho é importante para você, vale a pena testar se
lastIndexOf
é realmente mais rápido do que criar uma substring ou não. (Pode depender do mecanismo JS que você está usando ...) Pode ser mais rápido no caso correspondente, e quando a string é pequena - mas quando a string é enorme, é necessário olhar para trás, mesmo embora realmente não nos importemos :(Para verificar um único caractere, encontrar o comprimento e usá-lo
charAt
é provavelmente o melhor caminho.fonte
str+"$"
como regex estão quebradas, pois podem não ser regex válidas.Não vi a ligação com o
slice
método Então, eu vou deixar aqui:fonte
não funciona no caso em que o comprimento da string original é um menor que o comprimento da string de pesquisa e a string de pesquisa não é encontrada:
lastIndexOf retorna -1, você adiciona o comprimento da string de pesquisa e fica com o comprimento da string original.
Uma possível correção é
fonte
De developer.mozilla.org String.prototype.endsWith ()
Sumário
O
endsWith()
método determina se uma sequência termina com os caracteres de outra sequência, retornando verdadeiro ou falso, conforme apropriado.Sintaxe
Parâmetros
searchString : os caracteres a serem pesquisados no final dessa string.
position : pesquise nessa string como se ela tivesse apenas esse comprimento; assume como padrão o comprimento real dessa string, preso dentro do intervalo estabelecido pelo comprimento dessa string.
Descrição
Este método permite determinar se uma sequência termina ou não com outra.
Exemplos
Especificações
ECMAScript Language Specification 6ª Edição (ECMA-262)
Compatibilidade do navegador
fonte
- ou -
fonte
Eu espero que isso ajude
a maneira tradicional
fonte
Não sei você, mas:
Por que expressões regulares? Por que mexer com o protótipo? substr? Vamos lá...
fonte
Apenas outra alternativa rápida que funcionou como um encanto para mim, usando o regex:
fonte
Se você estiver usando lodash :
Se não estiver usando o lodash, você pode pedir emprestado de sua fonte .
fonte
Acabei de aprender sobre esta biblioteca de strings:
http://stringjs.com/
Inclua o arquivo js e use a
S
variável assim:Também pode ser usado no NodeJS instalando-o:
Em seguida, exigindo-o como a
S
variável:A página da web também possui links para bibliotecas de cadeias de caracteres alternativas, se esta não lhe agradar.
fonte
fonte
Tantas coisas para um problema tão pequeno, basta usar esta Expressão Regular
fonte
Faz muitos anos para esta pergunta. Deixe-me adicionar uma atualização importante para os usuários que desejam usar a resposta do chakrit mais votada.
As funções 'endsWith' já foram adicionadas ao JavaScript como parte do ECMAScript 6 (tecnologia experimental)
Consulte aqui: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
Portanto, é altamente recomendável adicionar a verificação da existência de implementação nativa, conforme mencionado na resposta.
fonte
fonte
Uma maneira de prova futura e / ou impedir a substituição do protótipo existente seria a verificação de teste para ver se ele já foi adicionado ao protótipo String. Aqui está a minha opinião sobre a versão não classificada como regex.
fonte
if (!String.prototype.hasOwnProperty("endsWith"))
é o melhor caminho. Comtypeof
, "MooTools e algumas das outras bibliotecas AJAX estragam você", de acordo com "Crockford on JavaScript - Nível 7: ECMAScript 5: The New Parts", às 15:50 min.A resposta aceita do @ chakrit é uma maneira sólida de fazer você mesmo. Se, no entanto, você estiver procurando uma solução em pacote, recomendo dar uma olhada em underscore.string , como apontou @mlunoe. Usando underscore.string, o código seria:
fonte
se você não quiser usar lasIndexOf ou substr, por que não apenas olhar a string em seu estado natural (ou seja, uma matriz)
ou como uma função autônoma
fonte
fonte
Depois de todas essas longas respostas, achei esse código simples e fácil de entender!
fonte
Esta é a implementação de endsWith:
String.prototype.endsWith = function (str) { return this.length >= str.length && this.substr(this.length - str.length) == str; }
fonte
Esta é a implementação de
endsWith
:fonte
Isso se baseia na resposta aceita do @ charkit, permitindo que uma matriz de strings ou uma string seja passada como argumento.
Isso requer underscorejs - mas provavelmente pode ser ajustado para remover a dependência de sublinhado.
fonte
_.str.endsWith
Benefícios:
fonte
Não use expressões regulares. Eles são lentos, mesmo em idiomas rápidos. Basta escrever uma função que verifique o final de uma string. Esta biblioteca tem exemplos agradáveis: groundjs / util.js . Cuidado ao adicionar uma função ao String.prototype. Este código tem bons exemplos de como fazê-lo: groundjs / prototype.js Em geral, esta é uma boa biblioteca em nível de idioma: groundjs Você também pode dar uma olhada no lodash
fonte
todos eles são exemplos muito úteis. Adicionando
String.prototype.endsWith = function(str)
nos ajudará a simplesmente chamar o método para verificar se nossa string termina com ela ou não, bem, o regexp também fará isso.Encontrei uma solução melhor que a minha. Obrigado a todos.
fonte
Para café
fonte