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?

Naveed
fonte
Use ES6 nova apresenta
Salvador Dali
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
}
Lukáš Lalinský
fonte
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) {
sje397
fonte
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.).

Sebastien P.
fonte
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

Salvador Dalí
fonte
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'
}
Mr. Pumpkin
fonte
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
16kb
fonte
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