7406 Stimmen

Wie prüft man in JavaScript, ob eine Zeichenkette eine Teilzeichenkette enthält?

Normalerweise würde ich erwarten, dass ein String.contains() Methode, aber es scheint keine zu geben.

Wie lässt sich dies sinnvoll überprüfen?

15824voto

Fabien Ménager Punkte 139981

ECMAScript 6 eingeführt String.prototype.includes :

const string = "foo";
const substring = "oo";

console.log(string.includes(substring)); // true

includes keine Unterstützung für den Internet Explorer hat Allerdings. In ECMAScript 5 oder älteren Umgebungen, verwenden Sie String.prototype.indexOf , die -1 zurückgibt, wenn eine Teilzeichenkette nicht gefunden wird:

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

console.log(string.indexOf(substring) !== -1); // true

56 Stimmen

Dies ist zwar eine gute Antwort, und der Antragsteller hat nie eine Suche unter Berücksichtigung der Groß- und Kleinschreibung verlangt, aber es sollte beachtet werden, dass includes führt eine Groß- und Kleinschreibung Suche.

0 Stimmen

Beinhaltet die Rückgabe von true für leere Teilstrings.

9 Stimmen

@Aashiq: Ja, eine leere Zeichenkette ist eine Teilzeichenkette von jeder Zeichenkette.

791voto

eliocs Punkte 17779

Es gibt eine String.prototype.includes in ES6 :

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

Beachten Sie, dass diese funktioniert nicht im Internet Explorer oder einigen anderen alten Browsern mit keiner oder unvollständiger ES6-Unterstützung. Damit es in alten Browsern funktioniert, können Sie einen Transpiler verwenden wie Babel eine Unterlegscheibenbibliothek wie es6-shim oder dies Polyfill von 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;
    }
  };
}

1 Stimmen

Nur neugierig, warum müssen Sie die Länge zu überprüfen? Schlägt IE in diesem Fall fehl oder so?

2 Stimmen

Auch die Prüfung auf number nicht wie includes . Beispiel: es6 includes liefert false für "abc".includes("ab", "1") diese Polyfill liefert true

107voto

wz366 Punkte 2570

Eine weitere Alternative ist KMP (Knuth-Morris-Pratt).

Der KMP-Algorithmus sucht nach einer Längen- m Teilzeichenfolge in einer Längen- n Zeichenfolge im schlimmsten Fall O( n + m ) Zeit, verglichen mit einem Worst-Case von O( n m ) für den naiven Algorithmus, so dass die Verwendung von KMP sinnvoll sein kann, wenn Sie sich um die Worst-Case-Zeitkomplexität kümmern.

Hier ist eine JavaScript-Implementierung des Projekts Nayuki, die aus 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
}

console.log(kmpSearch('ays', 'haystack') != -1) // true
console.log(kmpSearch('asdf', 'haystack') != -1) // false

10 Stimmen

Ich stelle nichts an diesem Ansatz in Frage... aber warum sollte man KMP implementieren, wenn es eine includes o indexOf auf dem Tisch. (Auch wenn die darunter liegenden vielleicht KMP verwenden... bin mir nicht sicher)

2 Stimmen

KMP bietet hier eine lineare O(n)-Leistung.

1 Stimmen

@wz366 KMP bietet O(n), was ist mit dem Rest? Irgendeine Idee?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X