it-swarm-es.tech

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

Por lo general, esperaría un método String.contains(), pero no parece haber uno.

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

7434
gramm

ES6 introdujo String.prototype.includes :

var string = "foo",
    substring = "oo";

string.includes(substring)

includesno tiene IE soporte , sin embargo. En un entorno ES5 o anterior, String.prototype.indexOf , que devuelve −1 cuando no encuentra la subcadena, puede usarse en su lugar:

var string = "foo",
    substring = "oo";

string.indexOf(substring) !== -1
12677
Fabien Ménager

Hay un String.prototype.includes en ES6 :

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

Tenga en cuenta que este no funciona en Internet Explorer o en otros navegadores antiguos con compatibilidad ES6 incompleta o incompleta. Para que funcione en navegadores antiguos, es posible que desee utilizar un transpiler como Babel , una biblioteca shim como es6-shim , o este polyfill de MDN :

if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }

    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}
438
eliocs

Otra alternativa es KMP .

El algoritmo KMP proporciona una búsqueda de subcadenas de tiempo lineal en el peor de los casos, por lo que es una forma razonable si le importa la complejidad del tiempo en el peor de los casos.

Aquí hay una implementación de JavaScript del Proyecto Nayuki, tomada de https://www.nayuki.io/res/knuth-morris-pratt-string-matching/kmp-string-matcher.js :

// Searches for the given pattern string in the given text string using the Knuth-Morris-Pratt string matching algorithm.
// If the pattern is found, this returns the index of the start of the earliest match in 'text'. Otherwise -1 is returned.
function kmpSearch(pattern, text) {
    if (pattern.length == 0)
        return 0;  // Immediate match

    // Compute longest suffix-prefix table
    var lsp = [0];  // Base case
    for (var i = 1; i < pattern.length; i++) {
        var j = lsp[i - 1];  // Start by assuming we're extending the previous LSP
        while (j > 0 && pattern.charAt(i) != pattern.charAt(j))
            j = lsp[j - 1];
        if (pattern.charAt(i) == pattern.charAt(j))
            j++;
        lsp.Push(j);
    }

    // Walk through text string
    var j = 0;  // Number of chars matched in pattern
    for (var i = 0; i < text.length; i++) {
        while (j > 0 && text.charAt(i) != pattern.charAt(j))
            j = lsp[j - 1];  // Fall back in the pattern
        if (text.charAt(i) == pattern.charAt(j)) {
            j++;  // Next char matched, increment position
            if (j == pattern.length)
                return i - (j - 1);
        }
    }
    return -1;  // Not found
}

Ejemplo de uso:

kmpSearch('ays', 'haystack') != -1 // true
kmpSearch('asdf', 'haystack') != -1 // false
8
wz366