border=0

"77.95.5.4 - 77.95.5.4"

Hoe te controleren of een string een substring in javascript bevat?

Normaal zou ik String.contains() verwachten, maar het ziet ernaar uit dat dit niet het geval is.

Wat is een redelijke manier om dit te verifiëren?

7436
24 нояб. stel gramm 24 nov in. 2009-11-24 16:04 '09 om 16:04, 2009-11-24 16:04
@ 49 antwoorden
  • 1
  • 2

Hier is een lijst met huidige functies:

1. (ES6) includes - ga naar het antwoord

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

2. ES5 en oudere indexOf

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

String.prototype.indexOf retourneert de positie van een tekenreeks in een andere tekenreeks. Als dit niet wordt gevonden, wordt -1 geretourneerd.

3. search - ga naar het antwoord

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

4. lodash omvat - ga naar het antwoord

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

5. RegExp - ga naar het antwoord

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

6. Match - ga naar antwoorden

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

Prestatietests tonen aan dat indexOf de beste keuze is als het gaat om het feit dat snelheid van be>

11502
24 нояб. Het antwoord wordt gegeven door Fabien Ménager 24 nov. 2009-11-24 16:05 '09 om 16.05 uur 2009-11-24 16:05

U kunt eenvoudig de methode contains toevoegen aan de tekenreeks met behulp van deze instructie:

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

Opmerking: zie onderstaande opmerkingen voor een geldig argument om het niet te gebruiken. Mijn advies: gebruik je eigen mening.

Als alternatief:

 if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } 
823
30 дек. Avi Flax antwoord is 30 december 2009-12-30 07:23 '10 om 07:23 uur 2009-12-30 07:23 uur

Het probleem met uw code is dat javascript hoofdlettergevoelig is. Methode aanroep

 indexof() 

moet zijn

 indexof() 

Probeer het te repareren en kijk of het helpt:

 if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; } 
429
24 нояб. Het antwoord wordt gegeven Victor 24 nov. 2009-11-24 17:17 '09 om 17:17 2009-11-24 17:17

Er is een string.includes in ES6 :

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

Houd er rekening mee dat u es6-shim of soortgelijk moet downloaden om dit in oudere browsers te laten werken.

 require('es6-shim') 
361
07 янв. het antwoord wordt gegeven op eliocs 07 jan. 2013-01-07 13:23 '13 om 13:23 2013-01-07 13:23
 var index = haystack.indexOf(needle); 
341
24 нояб. het antwoord wordt gegeven op pixlijn 24 nov. 2009-11-24 16:06 '09 om 16:06 2009-11-24 16:06

U kunt de JavaScript search() -methode gebruiken.

Syntaxis: string.search(regexp)

Retourneert de positie van een overeenkomst, of -1 als er geen overeenkomst is gevonden.

Zie voorbeelden: jsref_search

U hebt geen complexe syntaxis voor reguliere expressies nodig. Als u niet bekend bent met hen, zal het een eenvoudige st.search("title") . Als u wilt dat uw test niet hoofdlettergevoelig is, moet u st.search(/title/i) .

237
05 марта '10 в 12:53 2010-03-05 12:53 Antwoord wordt gegeven door Tardis op 05 maart '10 om 12:53 2010-03-05 12:53

String.prototype.includes() is geïntroduceerd in ES6.

Bepaalt of een reeks in een andere tekenreeks kan worden gevonden, respectievelijk waar of onwaar.

syntaxis

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

parameters

 searchString 

De tekenreeks waarnaar moet worden gezocht in deze tekenreeks.

 position 

De positie in deze reeks waar u standaard de zoekzoekreeks wilt starten 0.

voorbeeld

167
21 окт. Antwoord van Aniket Kulkarni 21 oktober. 2013-10-21 08:31 '13 om 8:31 uur 2013-10-21 08:31 uur

Als u op zoek was naar een alternatief om de check-ugly -1 te schrijven, voegt u een ~ tilde toe.

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

Joe Zimmerman - je zult zien dat met ~ on -1 het naar 0 wordt geconverteerd. Het getal 0 is false, wat betekent dat het als onwaar zal worden berekend wanneer het naar Boolean wordt geconverteerd. In eerste instantie lijkt dit niet erg sterk, maar onthoud dat functies, zoals indexOf, -1 retourneren wanneer de query niet wordt gevonden. Dit betekent dat in plaats van iets als dit te schrijven:

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

Nu hebt u mogelijk minder tekens in de code zodat u bijvoorbeeld kunt schrijven:

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

Meer informatie hier

120
12 мая '14 в 1:22 2014-05-12 01:22 Antwoord wordt gegeven door Christian Landgren op 12 mei '14 om 1:22 2014-05-12 01:22

Dit deel van de code zou goed moeten werken:

 var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic } 
82
29 мая '12 в 10:46 2012-05-29 10:46 het antwoord wordt gegeven door vaibhav op 29 mei '12 om 10:46 uur ( 2012-05-29 10:46)

De algemene manier om de JavaScript-code in javascript te schrijven is :

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

De bitsgewijze negatie-operator ( ~ ) wordt gebruikt om -1 in 0 (falsey) en alle andere waarden zijn niet nul (waar).

Operators met dubbele Booleaanse negatie worden gebruikt om een ​​getal in een logische vertaling om te zetten.

77
13 сент. Het antwoord is gegeven zzzzBov 13 september . 2012-09-13 06:45 '12 om 06:45 uur 2012-09-13 06:45

In ES5

76
08 авг. het antwoord wordt gegeven door Nisar 08 aug. 2015-08-08 14:44 '15 om 14:44 uur 2015-08-08 14:44 uur

In plaats van het gebruik van code-fragmenten die hier en daar op internet worden aangetroffen, kunt u ook een goed geteste en gedocumenteerde bibliotheek gebruiken. Twee opties die ik zou aanbevelen:


Optie 1: gebruik Lodash : het includes :

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

Lodash is de meest populaire javascript-bibliotheekserver voor npm en heeft veel nuttige javascript-hulpprogramma's. Dus voor veel projecten wil je dit nog steeds; -)


De tweede optie: Of gebruik Underscore.string : het heeft een include methode:

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

Hier is de beschrijving van Underscore.string, het voegt gewoon 9kb toe, maar geeft je alle voordelen die een goed geteste en gedocumenteerde bibliotheek heeft op copy'n'paste codefragmenten:

Underscore.string is een JavaScript-bibliotheek voor eenvoudige manipulatie van strings, een extensie voor Underscore.js, geïnspireerd op Prototype.js, Right.js, Underscore en een prachtige Ruby-taal.

Underscore.string biedt verschillende handige functies: capize, clean, include, count, escapeHTML, unescapeHTML, insert, splicing, startsWith, endsWith, headers, cropping, cropping, etc.

Merk op dat Underscore.string wordt beïnvloed door Underscore.js , maar zonder kan worden gebruikt.


Last but not least: de ingebouwde inbegrepen methode wordt geleverd met de ES6 JavaScript-versie:

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

De meeste moderne browsers ondersteunen het al, let op de ES6-compatibiliteitstabel .

64
13 дек. Het antwoord wordt gegeven nachtigall 13 dec. 2013-12-13 23:05 '13 om 23:05 uur 2013-12-13 23:05 uur

U kunt de jQuery gebruiken :contains selector.

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

Opmerking hier: bevat-selector

63
14 марта '11 в 5:10 2011-03-14 05:10 het antwoord wordt gegeven Chorinator 14 maart, '11 om 5:10 uur 2011-03-14 05:10

Gebruik een reguliere expressie:

RegExp.test(string)

61
24 нояб. het antwoord is rahul 24 nov gegeven. 2009-11-24 16:13 '09 om 16:13 2009-11-24 16:13

Het werkte gewoon voor mij. Hij selecteert regels zonder de term "Verwijderd:"

 if (eventString.indexOf("Deleted:") == -1) 
49
21 окт. het antwoord wordt op 21 oktober gegeven . 2011-10-21 00:50 '11 om 0:50 2011-10-21 00:50

Een andere manier om dit te doen is:

U kunt de match-functie gebruiken, dat wil zeggen:

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

match () kan ook werken met een reguliere expressie:

 x = "teststring"; if (x.match(/test/i)) { // Code } 
49
29 сент. Antwoord gegeven door David Craig 29 september 2012-09-29 13:40 '12 om 13:40 uur 2012-09-29 13:40 uur

U zocht naar .indexOf MDN .

indexOf retourneert het subscript-subscript. De index zal correleren met waar de substring begint. Als er geen overeenkomst is, wordt -1 geretourneerd. Hier is een eenvoudige demonstratie van dit concept:

29 авг. Antwoord gegeven door Travis J 29 aug. 2013-08-29 02:23 '13 om 2:23 2013-08-29 02:23

U moet indexOf met de hoofdletter "O" aanroepen, zoals aangegeven. Er moet ook worden opgemerkt dat u in een gereserveerde JavaScript-klasse-woord className moet gebruiken om dit gegevensattribuut te krijgen. De reden dat het waarschijnlijk mislukt, is dat het een nulwaarde retourneert. Je kunt het volgende doen om de waarde van je klas te krijgen ...

 var test = elm.getAttribute("className"); //or var test = elm.className 
48
24 нояб. Antwoord wordt gegeven door MillsJROSS 24 november 2009-11-24 18:52 '09 om 18:52 2009-11-24 18:52

Omdat de vraag nogal populair is, dacht ik dat ik een beetje modern smaakje aan de code kon toevoegen.

 // 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, het juiste antwoord is incorrect indexOf of niet-standaard String.contains . Het laden van een externe bibliotheek (vooral als de code in pure javascript is geschreven) of knoeien met String.prototype of het gebruik van een reguliere expressie is iets te ver gegaan.

34
27 окт. antwoord gegeven door Jay Harris 27 okt 2013-10-27 18:53 '13 om 18:53 2013-10-27 18:53

Er is een gestroomlijnde en betere manier om dit te doen, en het maakt gebruik van de operator (BitWise NOT).

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

Bitwise converteert "x" niet naar - (x + 1), dus als x -1 wordt verkregen van de indexOf-methode, dan zal het worden geconverteerd naar - (-1 + 1) = -0, wat een valse waarde is.

27
07 дек. Het antwoord is Kiba 07 dec. 2014-12-07 14:05 '14 om 14:05 2014-12-07 14:05

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

Zoals eerder vermeld, hebben JavaScript-strings zowel indexOf als search .

Het be>indexOf alleen indexOf gebruikt voor eenvoudige substrings, terwijl search ook reguliere expressies ondersteunt. Het voordeel van het gebruik van indexOf is natuurlijk dat het sneller is.

Zie ook In JavaScript, wat is het verschil tussen indexOf () en zoeken ()? .

Uw eigen methode String.prototype.contains()

Als u uw eigen methode wilt toevoegen aan elke regel, is @zzzzBov de beste manier om dit te doen :

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

Je zou het als volgt gebruiken:

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

Een aangepast hulpprogramma implementeren

Het wordt meestal niet aanbevolen om uw eigen methoden toe te voegen aan standaardobjecten in JavaScript, bijvoorbeeld omdat dit de compatibiliteit kan schaden.

Als je echt je eigen methode en / of andere aangepaste tekenreeksen nodig hebt, is het beter om je eigen bibliotheek met hulpprogramma's te maken en je eigen tekenreekmethoden aan deze bibliotheek toe te voegen:

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

Je zou het als volgt gebruiken:

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

Een hulpprogrammabibliotheek van derden gebruiken

Als u niet uw eigen hulpbibliotheek wilt maken, is er natuurlijk altijd de mogelijkheid om een ​​hulpprogrammabibliotheek van derden te gebruiken. Omdat @nachtigall werd genoemd, zijn Lodash en Underscore.js het populairst.

In Lodash kunt u _.includes() , die u als volgt gebruikt:

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

In Underscore.js kunt u _.str.include() , die u als volgt gebruikt:

 _.str.include('Hello World', 'orl'); 
24
21 февр. Antwoord gegeven door John Slegers 21 feb. 2016-02-21 19:52 '16 om 19:52 2016-02-21 19:52

De eenvoudigste oplossing

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

Je kunt het als volgt gebruiken

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

MDN Link

23
21 авг. antwoord gegeven door Sriramajeyam Sugumaran 21 aug. 2015-08-21 12:45 '15 om 12:45 uur 2015-08-21 12:45 uur
22
08 нояб. het antwoord wordt gegeven door user663031 08 nov. 2014-11-08 08:38 '14 om 8:38 uur 2014-11-08 08:38 uur

voorbeeld

 var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found } 
22
12 нояб. Antwoord gegeven door Ali Abbas op 12 november 2015-11-12 16:11 '15 om 16:11 2015-11-12 16:11

JavaScript-code voor het gebruik van de methode contains in een array:

 <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> 

In deze code bepaalt de methode contains of het opgegeven element aanwezig is in de array of niet. Als het opgegeven element in de array aanwezig is, wordt true geretourneerd, anders wordt false geretourneerd.

21
28 февр. Het antwoord wordt gegeven door Tarun Gupta op 28 februari. 2013-02-28 10:50 '13 om 10:50 2013-02-28 10:50

Om enkele geldige oplossingen te verzamelen:

19
16 июня '15 в 15:08 2015-06-16 15:08 het antwoord wordt gegeven op 16 juni 15 om 15:08 2015-06-16 15:08

Omdat er een klacht is over het gebruik van het prototype en omdat het gebruik van indexOf uw code minder leesbaar maakt en omdat regexp vol is:

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

Dit is een compromis dat ik heb gekregen.

17
22 авг. Het antwoord wordt gegeven Tjaart 22 aug. 2013-08-22 14:40 '13 om 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 дек. Het antwoord wordt gegeven door Alain Gauthier 16 dec. 2014-12-16 19:48 '14 om 19:48 2014-12-16 19:48

Gebruik de ingebouwde en eenvoudigste tekenreeks, bijv. match() in de tekenreeks. Om te bereiken wat u verwacht, doet u het volgende:

 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 het antwoord wordt gegeven door Ankur Madaan 02 mei '14 om 23:08 2014-05-02 23:08

De eenvoudigste manier is om indexOf te gebruiken. Als u de string voor de subtekenreeks wilt controleren, kunt u deze methode gebruiken:

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

Omdat u de functie string.contains() heeft, kunt u deze zelf als volgt implementeren:

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

Nu kunt u deze ecen kortere methode gebruiken om te controleren of een string een speciale subtekenreeks bevat:

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

Hier is de JSFiddle .

13
27 мая '14 в 15:52 2014-05-27 15:52 het antwoord wordt gegeven door Frieder op 27 mei '14 om 15:52 2014-05-27 15:52
  • 1
  • 2