Como saber que uma string inicia / termina com uma string específica no jQuery?


206

Quero saber se uma string começa com o caractere / string especificado ou termina com ela no jQuery.

Por exemplo:

var str = 'Hello World';

if( str starts with 'Hello' ) {
   alert('true');
} else {
   alert('false');
}

if( str ends with 'World' ) {
   alert('true');
} else {
   alert('false');
}

Se não houver nenhuma função, existe alguma alternativa?



2
Sim, bem, ou não use o ES6 ainda se você tiver usuários que usam o IE mais antigo que o Edge.
— Antares42

Respostas:


388

Uma opção é usar expressões regulares:

if (str.match("^Hello")) {
   // do this if begins with Hello
}

if (str.match("World$")) {
   // do this if ends in world
}

1
no jQuery, tentei str.startsWith ('alguma verificação de string ..') isso me deu um erro dizendo: beginWith método não encontrado .. :( mas str.match funcionou. Obrigado pela sua resposta
— Débora

2
Apenas tome cuidado para que a sequência que você está inspecionando não contenha caracteres reservados à expressão regular.
— Nokturnal

23
Passando um objeto regex em vez de uma seqüência de regex parece resolver o problema @nokturnal menciona: str.match(/^Hello/)Mas a forma /regex/.test(str)é ainda melhor para este caso particular, por stackoverflow.com/questions/10940137/...
— CrazyPyro

Isso retornaria uma string correspondente, mas não o valor booleano.
— precisa saber é o seguinte

var isUnavailable = $("#StatusId option:selected").text().match("^Unavailable - ");- por que isso retorna nulo quando a opção selecionada é "Indisponível - Outro"?
— egmfrs

96

Para começar com, você pode usar o indexOf:

if(str.indexOf('Hello') == 0) {

...

ref

e você pode fazer as contas com base no comprimento da string para determinar 'endswith'.

if(str.lastIndexOf('Hello') == str.length - 'Hello'.length) {

11
você pode querer usar lastIndexOf()para o final;)
— Reigel

Cuidado, o IndexOf não é suportado no navegador IE8. O mesmo com lastIndexOf.
— Pedro Lopes

1
Eu peço desculpas pela confusão. Eu estava me referindo Array.prototype.indexOf () que é suportado apenas para IE9 + e não String.prototype.indexOf () que é IE4 +
— Pedro Lopes

3
Uma resposta muito mais segura do que usar expressões regulares para um caso de uso tão simples. Provavelmente deve ser aceita resposta.
— 18716 AntonChanning

1
O código para 'endswith' está com defeito. Ao procurar uma sequência que não apareça na sequência e que tenha o comprimento = (palavra - 1). Por exemplo. ("1234".lastIndexOf('Hello') == "1234".length - 'Hello'.length)resulta em verdadeiro.
— Nick Russler

23

Não há necessidade de jQuery para fazer isso. Você poderia codificar um wrapper jQuery, mas seria inútil, portanto, você deveria usar melhor

var str = "Hello World";

window.alert("Starts with Hello ? " + /^Hello/i.test(str));        

window.alert("Ends with Hello ? " + /Hello$/i.test(str));

como o método match () está obsoleto.

PS: o sinalizador "i" no RegExp é opcional e significa distinção entre maiúsculas e minúsculas (portanto, também retornará true para "hello", "hEllo" etc.).


2
Você pode fornecer um link para a documentação de match () que está sendo preterida? Uma pesquisa rápida no Google não retorna nada.
— Cavyn VonDeylen

1
Eu li isso online há alguns anos atrás, receio não encontrar mais exatamente onde.
— Sebastien P.

16

Você realmente não precisa do jQuery para essas tarefas. Na especificação ES6, eles já têm os métodos prontos para uso , beginWith e endsWith .

var str = "To be, or not to be, that is the question.";
alert(str.startsWith("To be"));         // true
alert(str.startsWith("not to be"));     // false
alert(str.startsWith("not to be", 10)); // true

var str = "To be, or not to be, that is the question.";
alert( str.endsWith("question.") );  // true
alert( str.endsWith("to be") );      // false
alert( str.endsWith("to be", 19) );  // true

Atualmente disponível no FF e Chrome . Para navegadores antigos, você pode usar seus polyfills ou substr


10

Você sempre pode estender o Stringprotótipo assim:

//  Checks that string starts with the specific string
if (typeof String.prototype.startsWith != 'function') {
    String.prototype.startsWith = function (str) {
        return this.slice(0, str.length) == str;
    };
}

//  Checks that string ends with the specific string...
if (typeof String.prototype.endsWith != 'function') {
    String.prototype.endsWith = function (str) {
        return this.slice(-str.length) == str;
    };
}

E use-o assim:

var str = 'Hello World';

if( str.startsWith('Hello') ) {
   // your string starts with 'Hello'
}

if( str.endsWith('World') ) {
   // your string ends with 'World'
}

2

O ES6 agora suporta o método startsWith()e endsWith()para verificar o início e o final de strings. Se você deseja dar suporte aos mecanismos pre-es6, considere adicionar um dos métodos sugeridos ao Stringprotótipo.

if (typeof String.prototype.startsWith != 'function') {
  String.prototype.startsWith = function (str) {
    return this.match(new RegExp("^" + str));
  };
}

if (typeof String.prototype.endsWith != 'function') {
  String.prototype.endsWith = function (str) {
    return this.match(new RegExp(str + "$"));
  };
}

var str = "foobar is not barfoo";
console.log(str.startsWith("foob"); // true
console.log(str.endsWith("rfoo");   // true

Qualquer sequência que contenha caracteres que precisem ser escapados para o uso em uma regex (por exemplo ()[].) interromperá seus métodos de polyfill. Você precisa preparar as strings com uma função regex-escape. Ou melhor ainda: Use uma batalha testado polyfill decore-js
— nirazul
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.