Como verificar se uma string contém uma substring em javascript?

Normalmente, eu esperaria String.contains() , mas parece estar faltando.

O que é uma maneira razoável de verificar isso?

7436
24 нояб. set gramm 24 nov. 2009-11-24 16:04 '09 às 16:04 2009-11-24 16:04
@ 49 respostas
  • 1
  • 2

Aqui está uma lista dos recursos atuais:

1. (ES6) includes - ir para a resposta

 var string = "foo", substring = "oo"; string.includes(substring); 

2. ES5 e mais antigo indexOf

 var string = "foo", substring = "oo"; string.indexOf(substring) !== -1; 

String.prototype.indexOf retorna a posição de uma string em outra string. Se não for encontrado, retornará -1 .

3. search - ir para a resposta

 var string = "foo", expr = /oo/; string.search(expr); 

4. lodash inclui - ir para a resposta

 var string = "foo", substring = "oo"; _.includes(string, substring); 

5. RegExp - ir para a resposta

 var string = "foo", expr = /oo/; // no quotes here expr.test(string); 

6. Match - ir para responder

 var string = "foo", expr = /oo/; string.match(expr); 

Testes de desempenho mostram que indexOf pode ser a melhor escolha se o assunto for a velocidade.

11502
24 нояб. A resposta é dada por Fabien Ménager 24 de novembro. 2009-11-24 16:05 '09 às 16:05 2009-11-24 16:05

Você pode facilmente adicionar o método contains ao String usando esta instrução:

 String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; 

Nota: veja os comentários abaixo para um argumento válido para não usá-lo. Meu conselho: use sua própria opinião.

border=0

Alternativamente:

 if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } 
823
30 дек. A resposta do Avi Flax é 30 de dezembro 2009-12-30 07:23 '10 at 7:23 am 2009-12-30 07:23

O problema com o seu código é que o javascript é sensível a maiúsculas e minúsculas. Chamada de método

 indexof() 

deve ser

 indexof() 

Tente consertá-lo e veja se isso ajuda:

 if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; } 
429
24 нояб. A resposta é dada Victor 24 de novembro 2009-11-24 17:17 '09 às 17:17 2009-11-24 17:17

Existe uma string.includes no ES6 :

 "potato".includes("to"); > true 

Por favor, note que você pode precisar fazer o download de es6-shim ou similar para que isso funcione em navegadores mais antigos.

 require('es6-shim') 
361
07 янв. a resposta é dada eliocs 07 jan. 2013-01-07 13:23 '13 às 13:23 2013-01-07 13:23
 var index = haystack.indexOf(needle); 
341
24 нояб. a resposta é dada pixeline 24 nov. 2009-11-24 16:06 '09 às 16:06 2009-11-24 16:06

Você pode usar o método JavaScript search() .

Sintaxe: string.search(regexp)

Retorna a posição de uma correspondência ou -1 se uma correspondência não foi encontrada.

Veja exemplos: jsref_search

Você não precisa de sintaxe complexa de expressão regular. Se você não estiver familiarizado com eles, ele fará um simples st.search("title") . Se você quiser que seu teste seja insensível a maiúsculas e minúsculas, você deve fazer st.search(/title/i) .

237
05 марта '10 в 12:53 2010-03-05 12:53 A resposta é dada por Tardis em 05 de março de 2010 às 12:53 2010-03-05 12:53

String.prototype.includes() foi introduzido no ES6.

Determina se uma string pode ser encontrada em outra string, retornando true ou false, respectivamente.

Sintaxe

 var contained = str.includes(searchString [, position]); 

Parâmetros

 searchString 

A string para procurar dentro dessa string.

 position 

A posição nesta cadeia onde você deseja iniciar a searchString pesquisa de pesquisa por padrão 0.

Exemplo

21 окт. Resposta dada por Aniket Kulkarni 21 de outubro. 2013-10-21 08:31 '13 às 8:31 am 2013-10-21 08:31

Se você estava procurando uma alternativa para escrever o check-feio -1, em vez disso você adiciona um til ~.

 if (~haystack.indexOf('needle')) alert('found'); 

Joe Zimmerman - você verá que usar ~ on -1 o converte em 0. O número 0 é falso, o que significa que ele será calculado como falso quando convertido em booleano. A princípio, isso pode não parecer muito forte, mas lembre-se de que funções, como indexOf, retornam -1 quando a consulta não é localizada. Isso significa que, em vez de escrever algo assim:

 if (someStr.indexOf("a") >= 0) { // Found it } else { // Not Found } 

Agora você pode ter menos caracteres no código para poder escrever, por exemplo:

 if (~someStr.indexOf("a")) { // Found it } else { // Not Found } 

Mais detalhes aqui

120
12 мая '14 в 1:22 2014-05-12 01:22 Resposta é dada por Christian Landgren em 12 de maio de '14 às 1:22 2014-05-12 01:22

Esta parte do código deve funcionar bem:

 var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic } 
82
29 мая '12 в 10:46 2012-05-29 10:46 a resposta é dada por vaibhav em 29 de maio '12 às 10:46 2012-05-29 10:46

A maneira geral de escrever o método contains em javascript é :

 if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; } 

O operador de negação bit a bit ( ~ ) é usado para transformar -1 em 0 (falsey) e todos os outros valores serão diferentes de zero (verdadeiro).

Operadores com dupla negação booleana são usados ​​para converter números em números lógicos.

77
13 сент. a resposta é dada zzzzBov 13 de setembro . 2012-09-13 06:45 '12 at 6:45 am 2012-09-13 06:45

No ES5

76
08 авг. a resposta é dada Nisar 08 ago. 2015-08-08 14:44 '15 às 2:44 pm 2015-08-08 14:44

Em vez de usar snippets de código encontrados aqui e ali na Internet, você também pode usar uma biblioteca bem testada e documentada. Duas opções que eu recomendaria:


Opção 1: Use Lodash : includes :

 _.includes('foobar', 'ob'); // → true 

Lodash é a dependência de biblioteca javascript mais popular para npm e tem muitos métodos úteis de utilitário javascript. Então, para muitos projetos, você ainda quer isso; -)


A segunda opção: Ou use Underscore.string : tem um método include :

 _.str.include('foobar', 'ob'); // → true 

Aqui está a descrição de Underscore.string, ele apenas adiciona 9kb, mas oferece todas as vantagens que uma biblioteca bem testada e documentada tem em fragmentos de código do copy'n'paste:

Underscore.string é uma biblioteca JavaScript para fácil manipulação de strings, uma extensão para Underscore.js, inspirada em Prototype.js, Right.js, Underlining e uma linda linguagem Ruby.

O Underscore.string fornece várias funções úteis: capize, limpe, inclua, conte, escapeHTML, unescapeHTML, insert, splicing, startsWith, endsWith, cabeçalhos, corte, corte, etc.

Observe que o Underscore.string é afetado pelo Underscore.js , mas pode ser usado sem ele.


Por último, mas não menos importante: o método includes vem com a versão do ES6 JavaScript:

 'foobar'.includes('ob'); // → true 

A maioria dos navegadores modernos já suporta, preste atenção à tabela de compatibilidade do ES6 .

64
13 дек. A resposta é dada nachtigall 13 de dezembro 2013-12-13 23:05 '13 às 11:05 PM 2013-12-13 23:05

Você pode usar o seletor jQuery :contains .

 $("div:contains('John')") 

Note aqui: contém-seletor

63
14 марта '11 в 5:10 2011-03-14 05:10 a resposta é dada Chorinator 14 de março de 2011 às 5:10 am 2011-03-14 05:10

Use uma expressão regular:

RegExp.test(string)

61
24 нояб. a resposta é dada rahul 24 nov. 2009-11-24 16:13 '09 às 16:13 2009-11-24 16:13

Apenas funcionou para mim. Ele seleciona linhas que não contêm o termo "Excluído":

 if (eventString.indexOf("Deleted:") == -1) 
49
21 окт. resposta dada em 21 de outubro. 2011-10-21 00:50 '11 às 0:50 2011-10-21 00:50

Outra maneira de fazer isso é:

Você pode usar a função de correspondência, isto é, algo como:

 x = "teststring"; if (x.match("test")) { // Code } 

match () também pode trabalhar com uma expressão regular:

 x = "teststring"; if (x.match(/test/i)) { // Code } 
49
29 сент. Resposta dada por David Craig 29 de set 2012-09-29 13:40 '12 às 13:40 2012-09-29 13:40

Pesquisou por .indexOf MDN .

indexOf retornará o índice subscrito. O índice irá correlacionar com onde a substring começa. Se não houver correspondência, -1 será retornado. Aqui está uma demonstração simples desse conceito:

29 авг. Resposta dada por Travis J 29 ago. 2013-08-29 02:23 '13 às 2:23 2013-08-29 02:23

Você precisa chamar indexOf com o capital "O", conforme indicado. Também deve ser notado que em uma palavra reservada da classe JavaScript, você deve usar className para obter este atributo de dados. A razão pela qual é provável que falhe é que ele retorna um valor nulo. Você pode fazer o seguinte para obter o valor da sua turma ...

 var test = elm.getAttribute("className"); //or var test = elm.className 
48
24 нояб. Resposta é dada por MillsJROSS 24 nov 2009-11-24 18:52 '09 às 18:52 2009-11-24 18:52

Como a pergunta é bastante popular, achei que poderia adicionar um pouco de sabor moderno ao código.

 // const : creates an immutable constant const allLinks = document.getElementsByTagName("a"); // [].reduce.call : gives access to the reduce method on a HTMLCollection // () => {} : ES6 arrow function const foundLinks = [].reduce.call(allLinks, (sum, link) => { // bitwise OR : converts the boolean value to a number return sum + (link.classList.contains("title") | 0); }, 0); // template literal console.log('Found ${foundLinks || "no"} title class'); 

BTW, a resposta correta está errada indexOf ou String.contains não-padrão. Carregar uma biblioteca externa (especialmente se o código estiver escrito em javascript puro) ou mexer com String.prototype ou usar uma expressão regular foi um pouco longe demais.

34
27 окт. Resposta de Jay Harris, 27 de outubro 2013-10-27 18:53 '13 às 18:53 2013-10-27 18:53

Existe uma maneira elegante e melhor de fazer isso, e ele usa o operador (BitWise NOT).

 if(~"John".indexOf("J")) { alert("Found") } else { alert("Not Found"); } 

Bitwise não converte "x" para - (x + 1), portanto, se x é obtido -1 do método indexOf, então ele será convertido para - (-1 + 1) = -0, que é um valor falso.

27
07 дек. A resposta é dada Kiba 07 dec. 2014-12-07 14:05 '14 às 14:05 2014-12-07 14:05

String.prototype.indexOf() ou String.prototype.search() ?!

Como já foi mencionado, as strings JavaScript possuem indexOf e search .

A principal diferença entre os dois é que indexOf usado apenas para substrings simples, enquanto search também suporta expressões regulares. Claro, a vantagem de usar indexOf é que é mais rápido.

Veja também Em JavaScript, qual é a diferença entre indexOf () e search ()? .

Implementando seu próprio método String.prototype.contains()

Se você quiser adicionar seu próprio método contains a cada linha, a melhor maneira de fazer isso seria @zzzzBov :

 if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; } 

Você usaria da seguinte maneira:

 'Hello World'.contains('orl'); 

Implementando um utilitário customizado

Geralmente, não é recomendado adicionar seus próprios métodos a objetos padrão em JavaScript, por exemplo, porque isso pode quebrar a compatibilidade.

Se você realmente precisa do seu próprio método contains e / ou outros métodos de string personalizados, é melhor criar sua própria biblioteca de utilitários e adicionar seus próprios métodos de string a esta biblioteca:

 var helper = {}; helper.string = { contains : function (haystack, needle) { return !!~haystack.indexOf(needle); }, ... }; 

Você usaria da seguinte maneira:

 helper.string.contains('Hello World', 'orl'); 

Usando uma biblioteca de utilitários de terceiros

Se você não quiser criar sua própria biblioteca de suporte, há sempre a oportunidade de usar uma biblioteca de utilitários de terceiros. Como @nachtigall foi mencionado, os mais populares são Lodash e Underscore.js .

Em Lodash, você pode usar o _.includes() , que você usa da seguinte maneira:

 _.includes('Hello World', 'orl'); 

Em Underscore.js, você pode usar o _.str.include() , que você usa da seguinte maneira:

 _.str.include('Hello World', 'orl'); 
24
21 февр. Resposta dada por John Slegers 21 de fev. 2016-02-21 19:52 '16 às 19:52 2016-02-21 19:52

A solução mais simples

 if (!String.prototype.contains) { String.prototype.contains= function() { return String.prototype.indexOf.apply(this, arguments) !== -1; }; } 

Você pode usar o seguinte

 "hello".contains("he") // true "hello world".contains("lo w")//true "hello world".contains("lo wa")//false "hello world".contains(" ")//true "hello world".contains(" ")//false 

Link MDN

23
21 авг. Resposta dada por Sriramajeyam Sugumaran 21 ago 2015-08-21 12:45 '15 às 12:45 pm 2015-08-21 12:45
22
08 нояб. a resposta é dada por user663031 08 nov. 2014-11-08 08:38 '14 às 8:38 am 2014-11-08 08:38

Exemplo

 var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found } 
22
12 нояб. Resposta dada por Ali Abbas em 12 de novembro 2015-11-12 16:11 '15 às 16:11 2015-11-12 16:11

Código JavaScript para usar o método contains em uma matriz:

 <html> <head> <h2>Use of contains() method</h2> <script> Array.prototype.contains = function (element) { for (var i = 0; i < this.length; i++) { if (this[i] == element) { return true; } } return false; } arr1 = ["Rose", "India", "Technologies"]; document.write("The condition is "+arr1.contains("India")+"<br>"); </script> </head> <b>[If the specified element is present in the array, it returns true otherwise returns false.]</b> </html> 

Nesse código, o método contains determina se o elemento especificado está presente na matriz ou não. Se o elemento especificado estiver presente na matriz, ele retornará verdadeiro, caso contrário, retornará falso.

21
28 февр. A resposta é dada por Tarun Gupta 28 de fevereiro 2013-02-28 10:50 '13 às 10:50 2013-02-28 10:50

Para coletar algumas soluções válidas:

19
16 июня '15 в 15:08 2015-06-16 15:08 a resposta é dada shA.t 16 de junho '15 at 15:08 2015-06-16 15:08

Como há uma reclamação sobre o uso do protótipo, e desde que o uso do indexOf torna seu código menos legível e já que o regexp está cheio:

 function stringContains(inputString, stringToFind) { return (inputString.indexOf(stringToFind) != -1); } 

Este é um compromisso que eu tenho.

17
22 авг. a resposta é dada Tjaart 22 ago. 2013-08-22 14:40 '13 às 14:40 2013-08-22 14:40

Javascript

  var str = "My big string contain apples and oranges"; var n = str.indexOf("apples"); alert(n); //will alert 22, -1 if not found 

Jquery

  <p>My big string contain apples and oranges</p> alert($("p:contains(apples)")[0] != undefined); //will alert true if found 
17
16 дек. A resposta é dada por Alain Gauthier 16 dez. 2014-12-16 19:48 '14 às 19:48 2014-12-16 19:48

Use a string embutida e mais simples, ie match() na string. Para conseguir o que você espera, faça o seguinte:

 var stringData ="anyString Data"; var subStringToSearch = "any"; // This will give back the substring if matches and if not returns null var doesContains = stringData.match(subStringToSearch); if(doesContains !=null) { alert("Contains Substring"); } 
13
02 мая '14 в 23:08 2014-05-02 23:08 a resposta é dada por Ankur Madaan 02 May '14 at 23:08 2014-05-02 23:08

A maneira mais fácil é usar indexOf . Para simplesmente verificar a string para o substring de substring, você pode usar este método:

 string = "asdf"; substr = "as"; alert(string.indexOf(substr) == -1 ? false : true); 

Como você precisa da função string.contains() , você mesmo pode implementá-la da seguinte maneira:

 String.prototype.contains = function(test) { return this.indexOf(test) == -1 ? false : true; }; 

Agora você pode usar este método mais curto para verificar se uma string contém uma substring especial:

 string = "asdf"; alert(string.contains("as")); 

Aqui está o JSFiddle .

13
27 мая '14 в 15:52 2014-05-27 15:52 a resposta é dada por Frieder em 27 de maio de 2014 às 15:52 2014-05-27 15:52
  • 1
  • 2