¿Cómo comprobar si una cadena contiene una subcadena en javascript?

Normalmente, esperaría que String.contains() , pero parece faltar.

¿Cuál es una manera razonable de verificar esto?

7436
24 нояб. set gramm 24 nov. 2009-11-24 16:04 '09 a las 16:04 2009-11-24 16:04
@ 49 respuestas
  • 1
  • 2

Aquí hay una lista de las características actuales:

1. (ES6) includes - ir a la respuesta

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

2. ES5 y mayor indexOf

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

String.prototype.indexOf devuelve la posición de una cadena en otra cadena. Si no se encuentra, devolverá -1 .

3. search - ir a la respuesta

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

4. Incluye lodash - ir a la respuesta

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

5. RegExp - ir a la respuesta

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

6. Match - ir a responder

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

Las pruebas de rendimiento muestran que indexOf puede ser la mejor opción si se trata del hecho de que la velocidad es importante.

11502
24 нояб. La respuesta la da Fabien Ménager 24 nov. 2009-11-24 16:05 '09 a las 16:05 2009-11-24 16:05

Puede agregar fácilmente el método contains a la Cadena usando esta declaración:

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

Nota: vea los comentarios a continuación para un argumento válido para no usarlo. Mi consejo: usa tu propia opinión.

border=0

Alternativamente:

 if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } 
823
30 дек. La respuesta de Avi Flax es el 30 de diciembre. 2009-12-30 07:23 '10 a las 7:23 am 2009-12-30 07:23

El problema con su código es que javascript distingue entre mayúsculas y minúsculas. Método de llamada

 indexof() 

debe ser

 indexof() 

Intenta arreglarlo y ver si ayuda:

 if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; } 
429
24 нояб. La respuesta se da Víctor 24 de noviembre. 2009-11-24 17:17 '09 a las 17:17 2009-11-24 17:17

Hay una string.includes en ES6 :

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

Tenga en cuenta que es posible que necesite descargar es6-shim o similar para que esto funcione en navegadores más antiguos.

 require('es6-shim') 
361
07 янв. La respuesta se da eliocs 07 jan. 2013-01-07 13:23 '13 a las 13:23 2013-01-07 13:23
 var index = haystack.indexOf(needle); 
341
24 нояб. La respuesta se da pixelel 24 nov. 2009-11-24 16:06 '09 a las 16:06 2009-11-24 16:06

Puede utilizar el método de search() JavaScript.

Sintaxis: string.search(regexp)

Devuelve la posición de una coincidencia, o -1 si no se encontró una coincidencia.

Ver ejemplos: jsref_search

No necesita una sintaxis compleja de expresiones regulares. Si no está familiarizado con ellos, hará una st.search("title") simple st.search("title") . Si desea que su prueba no st.search(/title/i) mayúsculas de minúsculas, debe hacer una st.search(/title/i) .

237
05 марта '10 в 12:53 2010-03-05 12:53 La respuesta es dada por Tardis el 5 de marzo de 2010 a las 12:53 2010-03-05 12:53

String.prototype.includes() se introdujo en ES6.

Determina si una cadena se puede encontrar en otra cadena, devolviendo verdadero o falso, respectivamente.

Sintaxis

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

Parámetros

 searchString 

La cadena a buscar dentro de esta cadena.

 position 

La posición en esta cadena en la que desea iniciar la búsqueda por defecto 0.

Ejemplo

21 окт. Respuesta dada por Aniket Kulkarni el 21 de octubre. 2013-10-21 08:31 '13 a las 8:31 am 2013-10-21 08:31

Si estaba buscando una alternativa para escribir el check-feo -1, en su lugar, agregue una tilde.

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

Joe Zimmerman : verá que el uso de ~ en -1 lo convierte a 0. El número 0 es falso, lo que significa que se calculará como falso cuando se convierta en booleano. Al principio, esto puede no parecer muy fuerte, pero recuerde que las funciones, como indexOf, devuelven -1 cuando no se encuentra la consulta. Esto significa que en lugar de escribir algo como esto:

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

Ahora puede tener menos caracteres en el código para que pueda escribir, por ejemplo:

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

Más detalles aquí

120
12 мая '14 в 1:22 2014-05-12 01:22 Christian Landgren dio la respuesta el 12 de mayo de 2014 a las 1:22 2014-05-12 01:22

Esta parte del código debería funcionar bien:

 var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic } 
82
29 мая '12 в 10:46 2012-05-29 10:46 la respuesta la da vaibhav el 29 de mayo de 2012 a las 10:46 2012-05-29 10:46

La forma general de escribir el método contains en javascript es :

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

El operador de negación a nivel de bits ( ~ ) se utiliza para convertir -1 en 0 (falsey), y todos los demás valores serán distintos de cero (true).

Los operadores con doble negación booleana se utilizan para traducir números en números lógicos.

77
13 сент. la respuesta se da zzzzBov 13 sep . 2012-09-13 06:45 '12 a las 6:45 am 2012-09-13 06:45

En es5

76
08 авг. La respuesta la da Nisar 08 ago. 2015-08-08 14:44 '15 a las 2:44 pm 2015-08-08 14:44

En lugar de usar fragmentos de código que se encuentran aquí y allá en Internet, también puede usar una biblioteca bien probada y documentada. Dos opciones que recomendaría:


Opción 1: Usar Lodash : tiene includes :

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

Lodash es la dependencia de biblioteca javascript más popular para npm y tiene muchos métodos útiles de utilidad javascript. Así que para muchos proyectos, todavía quieres esto; -)


La segunda opción: O use Underscore.string : tiene un método de include :

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

Aquí está la descripción de Underscore.string, solo agrega 9kb, pero le brinda todas las ventajas que una biblioteca bien probada y documentada tiene en los fragmentos de código de copiar y pegar:

Underscore.string es una biblioteca de JavaScript para la fácil manipulación de cadenas, una extensión para Underscore.js, inspirada en Prototype.js, Right.js, subrayado y un hermoso lenguaje Ruby.

Underscore.string le proporciona varias funciones útiles: definir, limpiar, incluir, contar, escaparHTML, unescapeHTML, insertar, empalmar, comenzarCon, terminar con, encabezados, recortar, recortar, etc.

Tenga en cuenta que Underscore.string está afectado por Underscore.js , pero se puede usar sin él.


Por último, pero no menos importante: el método includes inclusión viene con la versión de ES6 JavaScript:

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

La mayoría de los navegadores modernos ya lo admiten, preste atención a la tabla de compatibilidad ES6 .

64
13 дек. La respuesta se da nachtigall 13 de diciembre. 2013-12-13 23:05 '13 a las 11:05 PM 2013-12-13 23:05

Puedes usar el jQuery :contains selector.

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

Tenga en cuenta aquí: contiene-selector

63
14 марта '11 в 5:10 2011-03-14 05:10 Chorinator , 14 de marzo de 2011 a las 5:10 a. m . 2011-03-14 05:10

Usa una expresión regular:

RegExp.test(string)

61
24 нояб. la respuesta se da rahul 24 nov. 2009-11-24 16:13 '09 a las 16:13 2009-11-24 16:13

Simplemente funcionó para mí. Selecciona las líneas que no contienen el término "Eliminado:"

 if (eventString.indexOf("Deleted:") == -1) 
49
21 окт. respuesta dada writtinfool 21 de octubre. 2011-10-21 00:50 '11 a las 0:50 2011-10-21 00:50

Otra forma de hacer esto es:

Puedes usar la función de coincidencia, es decir, algo como:

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

match () también puede trabajar con una expresión regular:

 x = "teststring"; if (x.match(/test/i)) { // Code } 
49
29 сент. Respuesta dada por David Craig el 29 de septiembre. 2012-09-29 13:40 '12 a las 13:40 2012-09-29 13:40

Has buscado .indexOf MDN .

indexOf devolverá el subíndice subíndice. El índice se correlacionará con donde comienza la subcadena. Si no hay coincidencia, se devuelve -1. Aquí hay una simple demostración de este concepto:

29 авг. Respuesta dada por Travis J 29 de agosto. 2013-08-29 02:23 '13 a las 2:23 2013-08-29 02:23

Debe llamar a indexOf con la "O" mayúscula, como se indica. También se debe tener en cuenta que en una palabra reservada de clase JavaScript, debe usar className para obtener este atributo de datos. La razón por la que es probable que falle es que devuelve un valor nulo. Puedes hacer lo siguiente para obtener el valor de tu clase ...

 var test = elm.getAttribute("className"); //or var test = elm.className 
48
24 нояб. La respuesta es dada por MillsJROSS el 24 de noviembre. 2009-11-24 18:52 '09 a las 18:52 2009-11-24 18:52

Como la pregunta es bastante popular, pensé que podría agregar un poco de sabor moderno al 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'); 

Por cierto, la respuesta correcta es indexOf incorrecto o indexOf no estándar. Cargar una biblioteca externa (especialmente si el código está escrito en javascript puro) o jugar con String.prototype o usar una expresión regular ha ido demasiado lejos.

34
27 окт. Respuesta de Jay Harris 27 de octubre 2013-10-27 18:53 '13 a las 18:53 2013-10-27 18:53

Hay una forma elegante y mejor de hacer esto, y utiliza el operador (BitWise NOT).

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

Bitwise no convierte "x" a - (x + 1), por lo que si x se obtiene -1 del método indexOf, se convertirá a - (-1 + 1) = -0, que es un valor falso.

27
07 дек. La respuesta se da Kiba 07 dic. 2014-12-07 14:05 '14 a las 14:05 2014-12-07 14:05

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

Como ya se mencionó, las cadenas de JavaScript tienen indexOf y search .

La diferencia clave entre los dos es que indexOf usa solo para subcadenas simples, mientras que la search también admite expresiones regulares. Por supuesto, la ventaja de usar indexOf es que es más rápido.

Consulte también En JavaScript, ¿cuál es la diferencia entre indexOf () y search ()? .

Implementando su propio método String.prototype.contains()

Si desea agregar su propio método de contains a cada línea, la mejor manera de hacerlo sería @zzzzBov :

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

Lo usarías de la siguiente manera:

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

Implementando una utilidad personalizada

Por lo general, no se recomienda agregar sus propios métodos a los objetos estándar en JavaScript, por ejemplo, porque esto puede romper la compatibilidad.

Si realmente necesita su propio método de contención y / u otros métodos de cadena personalizados, es mejor crear su propia biblioteca de utilidades y agregar sus propios métodos de cadena a esta biblioteca:

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

Lo usarías de la siguiente manera:

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

Usando una biblioteca de utilidad de terceros

Si no desea crear su propia biblioteca auxiliar, por supuesto, siempre existe la oportunidad de utilizar una biblioteca de utilidades de terceros. Como se mencionó @nachtigall , los más populares son Lodash y Underscore.js .

En Lodash, puede usar _.includes() , que usa de la siguiente manera:

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

En Underscore.js, puede usar _.str.include() , que usa de la siguiente manera:

 _.str.include('Hello World', 'orl'); 
24
21 февр. Respuesta dada por John Slegers el 21 de febrero. 2016-02-21 19:52 '16 a las 19:52 2016-02-21 19:52

La solución más simple

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

Se puede utilizar de la siguiente manera

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

Enlace MDN

23
21 авг. respuesta dada por Sriramajeyam Sugumaran 21 de agosto. 2015-08-21 12:45 '15 a las 12:45 pm 2015-08-21 12:45
22
08 нояб. la respuesta es dada por user663031 08 nov. 2014-11-08 08:38 '14 a las 8:38 am 2014-11-08 08:38

Ejemplo

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

Código JavaScript para usar el método contains en una 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> 

En este código, el método contains determina si el elemento especificado está presente en la matriz o no. Si el elemento especificado está presente en la matriz, devuelve verdadero, de lo contrario, devuelve falso.

21
28 февр. La respuesta es dada por Tarun Gupta el 28 de febrero. 2013-02-28 10:50 '13 a las 10:50 2013-02-28 10:50

Para recoger algunas soluciones válidas:

19
16 июня '15 в 15:08 2015-06-16 15:08 la respuesta se da shA.t 16 de junio de 15 a 15:08 2015-06-16 15:08

Ya que hay una queja sobre el uso del prototipo, y dado que el uso de indexOf hace que su código sea menos legible y como regexp está completo:

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

Este es un compromiso que tengo.

17
22 авг. La respuesta se da Tjaart 22 ago. 2013-08-22 14:40 '13 a las 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 дек. La respuesta la da Alain Gauthier el 16 de diciembre. 2014-12-16 19:48 '14 a las 19:48 2014-12-16 19:48

Use la cadena incorporada y más simple, es decir, match() en la cadena. Para lograr lo que esperas, haz lo siguiente:

 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 La respuesta la da Ankur Madaan 02 de mayo de 2014 a las 23:08 2014-05-02 23:08

La forma más fácil es usar indexOf . Para verificar simplemente la string para la subcadena de subcadenas, puede usar este método:

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

Cuando necesite la función string.contains() , puede implementarla usted mismo de la siguiente manera:

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

Ahora puede usar este método más corto para verificar si una cadena contiene una subcadena especial:

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

Aquí está el JSFiddle .

13
27 мая '14 в 15:52 2014-05-27 15:52 La respuesta la da Frieder el 27 de mayo de 2014 a las 15:52 2014-05-27 15:52
  • 1
  • 2