Frage Wie überprüft man, ob eine Zeichenkette eine Teilkette in JavaScript enthält?


Normalerweise würde ich a erwarten String.contains() Methode, aber es scheint nicht zu sein.

Was ist ein vernünftiger Weg dies zu überprüfen?


7436
2017-11-24 13:05


Ursprung


Antworten:


Hier ist eine Liste der aktuellen Möglichkeiten:

1. (ES6) includes-Geh, um zu antworten

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

2. ES5 und älter indexOf

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

String.prototype.indexOf gibt die Position der Zeichenfolge in der anderen Zeichenfolge zurück. Wenn nicht gefunden, wird es zurückkehren -1.

3. search-Geh, um zu antworten

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

4. lodash beinhaltet-Geh, um zu antworten

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

5. RegExp-Geh, um zu antworten

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

6. Spiel-Geh, um zu antworten

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

Leistungstests zeigen das indexOf könnte die beste Wahl sein, wenn es auf einen Punkt ankommt, wo Geschwindigkeit zählt.


11460
2017-12-30 04:23



Sie können einfach ein hinzufügen contains Methode zu String mit dieser Anweisung:

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

Hinweis: In den folgenden Kommentaren finden Sie ein gültiges Argument dafür, dies nicht zu verwenden. Mein Rat: Verwenden Sie Ihr eigenes Urteil.

Alternative:

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

822
2017-11-24 14:17



Das Problem mit Ihrem Code ist, dass JavaScript die Groß- / Kleinschreibung berücksichtigt. Ihr Methodenaufruf

indexof()

sollte eigentlich sein

indexOf()

Versuchen Sie es zu beheben und sehen Sie, ob das hilft:

if (test.indexOf("title") !=-1) {
    alert(elm);
    foundLinks++;
}

427
2018-01-07 10:23



Da ist ein string.includes in ES6:

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

Beachten Sie, dass Sie möglicherweise laden müssen es6-shim oder ähnlich, um dies auf älteren Browsern zu ermöglichen.

require('es6-shim')

359
2017-11-24 13:06



var index = haystack.indexOf(needle);

340
2018-03-05 09:53



Sie könnten das JavaScript verwenden search() Methode.

Syntax ist: string.search(regexp)

Es gibt die Position der Übereinstimmung oder -1 zurück, wenn keine Übereinstimmung gefunden wird.

Siehe Beispiele dort: jsref_search

Sie benötigen keine komplizierte Syntax für reguläre Ausdrücke. Wenn Sie nicht mit ihnen vertraut sind, ein einfaches st.search("title") Wird besorgt. Wenn Sie möchten, dass Ihr Test nicht zwischen Groß- und Kleinschreibung unterscheidet, sollten Sie dies tun st.search(/title/i).


237
2017-10-21 05:31



String.prototype.includes() wurde in ES6 eingeführt.

Bestimmt, ob eine Zeichenfolge in einer anderen Zeichenfolge gefunden werden kann.   Wahr oder falsch zurückgeben, wie es angemessen ist.

Syntax

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

Parameter

searchString

Eine Zeichenfolge, nach der innerhalb dieser Zeichenfolge gesucht werden soll.

position

Die Position in dieser Zeichenfolge, in der gesucht werden soll searchString Standardwert ist 0.

Beispiel

var str = "To be, or not to be, that is the question.";

console.log(str.includes("To be"));    // true
console.log(str.includes("question")); // true
console.log(str.includes("To be", 1)); // false  

Hinweis

Dies kann ES6 Shim in älteren Browsern erfordern.


167
2018-05-29 07:46



Wenn Sie nach einer Alternative suchen, um den hässlichen -1-Haken zu schreiben, fügen Sie stattdessen eine ~ Tilde hinzu.

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

Joe Zimmermann - Sie sehen, dass die Verwendung von ~ bei -1 es in 0 umwandelt. Die Zahl 0 ist a   falscher Wert, was bedeutet, dass er nach Konvertierung in false ausgewertet wird   ein Boolescher Wert Das mag auf den ersten Blick keine große Erkenntnis sein, aber   erinnern Funktionen wie indexOf gibt -1 zurück, wenn die Abfrage nicht ist   gefunden. Dies bedeutet, dass, anstatt etwas ähnliches zu schreiben:

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

Sie können jetzt weniger Zeichen in Ihrem Code haben, damit Sie sie schreiben können   so was:

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

Mehr Details hier


120
2017-09-13 03:45