Kako provjeriti sadrži li niz podniz u javascriptu?

Obično bih očekivao String.contains() , ali izgleda da nedostaje.

Koji je razuman način da to potvrdite?

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

Evo popisa trenutnih značajki:

1. (ES6) includes - idite na odgovor

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

2. ES5 i stariji indexOf

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

String.prototype.indexOf vraća položaj niza u drugom nizu. Ako se ne pronađe, vratit će se -1 .

3. search - idite na odgovor

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

4. lodash uključuje - idite na odgovor

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

5. RegExp - idite na odgovor

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

6. Podudaranje - idite na odgovor

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

Testovi performansi pokazuju da indexOf može biti najbolji izbor ako dođe do činjenice da je brzina važna.

11.502
24 нояб. Odgovor daje Fabien Ménager 24 nov. 2009-11-24 16:05 '09 u 16:05 2009-11-24 16:05

Metodu " contains možete jednostavno dodati Stringu koristeći ovu naredbu:

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

Napomena: pogledajte komentare ispod za valjani argument da ga ne koristite. Moj savjet: koristite vlastito mišljenje.

border=0

Alternativno:

 if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } 
823
30 дек. Avi Flax odgovor je 30 prosinca. 2009-12-30 07:23 '10 u 7:23 am 2009-12-30 07:23

Problem s vašim kodom je taj da je javascript osjetljiv na velika i mala slova. Poziv metode

 indexof() 

mora biti

 indexof() 

Pokušajte to popraviti i provjerite pomaže li:

 if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; } 
429
24 нояб. Odgovor je dat Victor 24 Nov. 2009-11-24 17:17 '09 u 17:17 2009-11-24 17:17

Postoji string.includes u ES6 :

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

Imajte na umu da ćete možda morati preuzeti es6-shim ili slično kako biste to mogli raditi u starijim preglednicima.

 require('es6-shim') 
361
07 янв. odgovor je dan eliocs 07 jan. 2013-01-07 13:23 '13 u 13:23 2013-01-07 13:23
 var index = haystack.indexOf(needle); 
341
24 нояб. odgovor je dat pikselom 24 nov. 2009-11-24 16:06 '09 u 16:06 2009-11-24 16:06

Možete koristiti metodu za search() JavaScript.

Sintaksa: string.search(regexp)

Vraća poziciju podudaranja ili -1 ako podudaranje nije pronađeno.

Pogledajte primjere: jsref_search

Ne trebate složenu sintaksu regularnog izraza. Ako ih ne poznajete, to će učiniti jednostavnim st.search("title") . Ako želite da vaš test bude neosjetljiv na velika i mala slova, morate učiniti st.search(/title/i) .

237
05 марта '10 в 12:53 2010-03-05 12:53 Odgovor je dao Tardis 05. ožujka u 12:53 2010-03-05 12:53

String.prototype.includes() je uveden u ES6.

Određuje može li se jedan niz naći u drugom nizu, vraćajući true ili false.

sintaksa

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

parametri

 searchString 

Niz za traženje unutar tog niza.

 position 

Položaj u ovom nizu u kojem želite započeti traženje searchString zadanih vrijednosti 0.

primjer

167
21 окт. odgovor od Aniket Kulkarni 21. listopada. 2013-10-21 08:31 '13 u 8:31 am 2013-10-21 08:31

Ako ste tražili alternativu za pisanje check-ruly -1, umjesto toga dodajte ~ tildu.

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

Joe Zimmerman - vidjet ćete da se pomoću ~ na -1 pretvara u 0. Broj 0 je netočan, što znači da će se izračunati kao lažna kada se pretvori u boolean. Isprva se to ne čini jako snažnim, ali zapamtite da funkcije, kao što je indexOf, vraćaju -1 kada upit nije pronađen. To znači da umjesto pisanja nešto poput ovoga:

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

Sada možete imati manje znakova u kodu, tako da možete napisati na primjer:

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

Više detalja ovdje

120
12 мая '14 в 1:22 2014-05-12 01:22 Odgovor je dao Christian Landgren 12. svibnja u 14 sati u 1:22 2014-05-12 01:22

Ovaj dio koda trebao bi dobro funkcionirati:

 var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic } 
82
29 мая '12 в 10:46 2012-05-29 10:46 odgovor je dao vaibhav 29. svibnja 2012. u 10:46 2012-05-29 10:46

Opći način pisanja metode contains u javascriptu :

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

Operator bitne negacije ( ~ ) koristi se za okretanje -1 u 0 (falsey), a sve ostale vrijednosti će biti ne-nula (true).

Operatori s dvostrukom logičkom negacijom koriste se za prevođenje brojeva u logičke.

77
13 сент. odgovor je dat zzzzBov 13 sep . 2012-09-13 06:45 '12 u 6:45 am 2012-09-13 06:45

U ES5

76
08 авг. odgovor je dan Nisar 08 aug. 2015-08-08 14:44 '15 u 14:44 sati 2015-08-08 14:44

Umjesto isječaka koda koji se nalaze tu i tamo na internetu, možete koristiti dobro testiranu i dokumentiranu knjižnicu. Dvije opcije koje bih preporučio:


Opcija 1: Koristite Lodash : includes :

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

Lodash je najpopularnija ovisnost o JavaScript biblioteci za npm i ima mnoge korisne metode korisne za javascript. Dakle, za mnoge projekte to i dalje želite; -)


Druga opcija: Ili upotrijebite Underscore.string : ima metodu include :

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

Ovdje je opis Underscore.string, on samo dodaje 9kb, ali vam daje sve prednosti koje dobro testirana i dokumentirana knjižnica ima na fragmentima copy'n'paste code:

Underscore.string je JavaScript knjižnica za jednostavnu manipulaciju nizovima, proširenje za Underscore.js, inspirirano Prototype.js, Right.js, Podcrtavanjem i lijepim Ruby jezikom.

Underscore.string pruža nekoliko korisnih funkcija: capize, clean, include, count, escapeHTML, unescapeHTML, insert, splicing, startWith, endsWith, headers, trimming, cropping, itd.

Imajte na umu da na Underscore.string utječe Underscore.js , ali se može koristiti i bez njega.


Posljednje, ali ne i najmanje važno: ugrađena metoda includes verziju ES6 JavaScripta:

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

Većina modernih preglednika već je podržava, obratite pozornost na ES6 tablicu kompatibilnosti .

64
13 дек. Odgovor je dat na nachtigall 13 prosinca. 2013-12-13 23:05 '13 u 23:05 2013-12-13 23:05

Možete koristiti jQuery :contains izbornik.

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

Napomena ovdje: sadrži-selektor

63
14 марта '11 в 5:10 2011-03-14 05:10 odgovor je dat Chorinator 14. ožujka '11 u 5:10 am 2011-03-14 05:10

Koristite regularni izraz:

RegExp.test(string)

61
24 нояб. odgovor je dat 24. srpnja. 2009-11-24 16:13 '09 u 16:13 2009-11-24 16:13

Samo mi je pomoglo. On odabire retke koje ne sadrže pojam "Izbrisano:"

 if (eventString.indexOf("Deleted:") == -1) 
49
21 окт. odgovor dati writtinfool Lis 21. \ t 2011-10-21 00:50 '11 u 0:50 2011-10-21 00:50

Drugi način za to je:

Možete koristiti funkciju podudaranja, to jest, nešto poput:

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

match () također može raditi s regularnim izrazom:

 x = "teststring"; if (x.match(/test/i)) { // Code } 
49
29 сент. Odgovor dao David Craig 29. rujna 2012-09-29 13:40 '12 u 13:40 2012-09-29 13:40

Tražili ste .indexOf MDN .

indexOf će vratiti indeks indeksa. Indeks će se povezati s početkom podnizova. Ako nema podudaranja, vraća se -1. Evo jednostavne demonstracije ovog koncepta:

29 авг. Odgovor dao Travis J 29 Aug. 2013-08-29 02:23 '13 u 2:23 2013-08-29 02:23

Morate pozvati indexOf s glavnim "O", kao što je naznačeno. Također treba napomenuti da u rezerviranoj riječi klase JavaScript morate koristiti className da biste dobili ovaj atribut podataka. Razlog zbog kojeg je vjerojatno da neće uspjeti je to što vraća null vrijednost. Možete učiniti sljedeće da biste dobili vrijednost svoje klase ...

 var test = elm.getAttribute("className"); //or var test = elm.className 
48
24 нояб. Odgovor daje MillsJROSS 24. studenog 2009-11-24 18:52 '09 u 18:52 2009-11-24 18:52

Budući da je pitanje vrlo popularno, pomislio sam da mogu dodati malo modernog okusa kodu.

 // 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, točan odgovor je pogrešan indexOf ili nestandardni String.contains . Učitavanje vanjske knjižnice (pogotovo ako je kôd napisano u čistom javascriptu) ili String.prototype sa String.prototype ili korištenjem regularnog izraza otišlo je predaleko.

34
27 окт. Odgovori Jay Harris 27. listopada 2013-10-27 18:53 '13 u 18:53 2013-10-27 18:53

Tu je gladak i bolji način da to učinite, i on koristi operatora (BitWise NE).

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

Bitski se ne pretvara "x" u - (x + 1), pa ako je x dobiven -1 iz metode indexOf, tada će se pretvoriti u - (-1 + 1) = -0, što je lažna vrijednost.

27
07 дек. Odgovor je dan Kiba 07 dec. 2014-12-07 14:05 '14 u 14:05 2014-12-07 14:05

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

Kao što je već spomenuto, JavaScript stringovi imaju i indexOf i search .

Ključna razlika između njih je u tome što se indexOf koristi samo za jednostavne podnizove, dok search također podržava regularne izraze. Naravno, prednost korištenja indexOf je da je brži.

Vidi također U JavaScriptu, koja je razlika između indexOf () i pretraživanja ()? ,

Primjena vlastite metode String.prototype.contains()

Ako u svaku liniju želite dodati vlastitu metodu, najbolji način da to učinite je @zzzzBov :

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

Koristili biste ga na sljedeći način:

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

Primjena prilagođene korisnosti

Obično se ne preporučuje dodavanje vlastitih metoda na standardne objekte u JavaScriptu, na primjer, jer to može prekinuti kompatibilnost.

Ako stvarno trebate vlastitu metodu i / ili druge prilagođene metode, bolje je da kreirate vlastitu knjižnicu uslužnog programa i da dodate vlastite metode niza u ovu biblioteku:

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

Koristili biste ga na sljedeći način:

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

Korištenje pomoćne knjižnice treće strane

Ako ne želite stvoriti vlastitu knjižnicu za podršku, naravno da uvijek postoji mogućnost korištenja pomoćne knjižnice treće strane. Kao što se spominje @nachtigall , najpopularnije su Lodash i Underscore.js .

U Lodashu možete koristiti _.includes() , koji koristite na sljedeći način:

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

U _.str.include() možete koristiti _.str.include() koji koristite na sljedeći način:

 _.str.include('Hello World', 'orl'); 
24
21 февр. Odgovor dao John Slegers 21. veljače. 2016-02-21 19:52 '16 u 19:52 2016-02-21 19:52

Najjednostavnije rješenje

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

Možete koristiti kako slijedi

 "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 авг. odgovor od Sriramajeyam Sugumaran 21. kolovoza 2015-08-21 12:45 '15 u 12:45 sati 2015-08-21 12:45
22
08 нояб. odgovor daje korisnik663031 08 Nov. 2014-11-08 08:38 '14 u 8:38 am 2014-11-08 08:38

primjer

 var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found } 
22
12 нояб. Odgovor dao je Abbas 12. studenog 2015-11-12 16:11 '15 u 16:11 2015-11-12 16:11

JavaScript kôd za upotrebu contains metodu u nizu:

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

U ovom kodu, contains metoda utvrđuje je li navedeni element prisutan u nizu ili ne. Ako je specificirani element prisutan u nizu, vraća true, inače vraća false.

21
28 февр. Odgovor daje Tarun Gupta 28. veljače. 2013-02-28 10:50 '13 u 10:50 2013-02-28 10:50

Da biste prikupili neka valjana rješenja:

19
16 июня '15 в 15:08 2015-06-16 15:08 odgovor je dat shA.t 16. lipnja '15 u 15:08 2015-06-16 15:08

Budući da postoji pritužba na korištenje prototipa, a upotreba indexOf čini vaš kod manje čitljivim i pošto je regexp pun:

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

Ovo je kompromis koji sam dobio.

17
22 авг. odgovor je dat Tjaart 22 aug. 2013-08-22 14:40 '13 u 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 дек. Odgovor daje Alain Gauthier 16. prosinca. 2014-12-16 19:48 '14 u 19:48 2014-12-16 19:48

Koristite ugrađeni i najjednostavniji niz, tj. match() u nizu. Da biste postigli ono što očekujete, učinite sljedeće:

 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 odgovor je dao Ankur Madaan 02 svibanj '14 u 23:08 2014-05-02 23:08

Najlakši način je da koristite indexOf . Da biste jednostavno provjerili string za substring substring, možete koristiti ovu metodu:

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

Kako vam je potrebna funkcija string.contains() , možete je sami implementirati na sljedeći način:

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

Sada možete koristiti ovu metodu ecen shorter kako biste provjerili sadrži li niz poseban podniz:

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

Ovdje je JSFiddle .

13
27 мая '14 в 15:52 2014-05-27 15:52 odgovor je dao frieder 27. svibnja 14 u 15:52 2014-05-27 15:52
  • 1
  • 2