Как да проверите дали даден низ съдържа подстрока в javascript?

Обикновено очаквам String.contains() , но изглежда липсва.

Какво е разумен начин да се провери това?

7436
24 нояб. определени грам 24 ноември. 2009-11-24 16:04 '09 в 16:04 2009-11-24 16:04
@ 49 отговора
  • 1
  • 2

Ето списък на текущите функции:

1. (ES6) includes - отидете на отговора

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

2. ES5 и по-стари indexOf

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

String.prototype.indexOf връща позицията на низ в друг низ. Ако не бъде намерен, ще се върне -1 .

3. search - отидете на отговора

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

4. “лодаш” включва - отидете на отговора

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

5. RegExp - отидете на отговора

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

6. Съвпадение - отидете на отговор

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

Тестовете за изпълнение показват, че indexOf може да бъде най-добрият избор, ако става въпрос за факта, че скоростта е от значение.

11502
24 нояб. Отговорът е даден от Fabien Ménager 24 ноември. 2009-11-24 16:05 '09 в 16:05 2009-11-24 16:05

Можете лесно да добавите метода contains в String, използвайки това изявление:

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

Забележка: вижте коментарите по-долу за валиден аргумент за това, че не го използвате. Моят съвет: използвайте собственото си мнение.

border=0

Като алтернатива:

 if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } 
823
30 дек. Отговорът на Avi Flax е 30 декември. 2009-12-30 07:23 '10 в 7:23 am 2009-12-30 07:23

Проблемът с кода е, че javascript е чувствителен към малки и големи букви. Извикване на метод

 indexof() 

трябва да бъде

 indexof() 

Опитайте се да го поправите и вижте дали помага:

 if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; } 
429
24 нояб. Отговорът е даден на Виктор 24 ноември. 2009-11-24 17:17 '09 в 17:17 2009-11-24 17:17

Съществува низ.включва в ES6 :

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

Моля, обърнете внимание, че може да се наложи да изтеглите es6-shim или подобно, за да работи това в по-стари браузъри.

 require('es6-shim') 
361
07 янв. отговорът е даден eliocs 07 jan. 2013-01-07 13:23 '13 в 13:23 2013-01-07 13:23
 var index = haystack.indexOf(needle); 
341
24 нояб. отговорът е даден пиксел 24 ноември. 2009-11-24 16:06 '09 в 16:06 2009-11-24 16:06

Можете да използвате JavaScript метода за search() .

Синтаксис: string.search(regexp)

Връща позицията на съвпадение или -1, ако съвпадение не е намерено.

Вижте примери: jsref_search

Не се нуждаете от сложен синтаксис на регулярни изрази. Ако не сте запознати с тях, той ще направи обикновен st.search("title") . Ако искате тестът да не е чувствителен към регистър, трябва да направите st.search(/title/i) .

237
05 марта '10 в 12:53 2010-03-05 12:53 Отговорът е даден от Тардис на 05 март 2007 г. в 12:53 2010-03-05 12:53

String.prototype.includes() е въведена в ES6.

Определя дали един низ може да бъде намерен в друг низ, съответно връщащ true или false.

синтаксис

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

параметри

 searchString 

Последователният низ за търсене в този низ.

 position 

Позицията в този низ, където искате да започнете търсения searchString по подразбиране 0.

пример

167
21 окт. отговор, даден от Aniket Kulkarni 21 октомври. 2013-10-21 08:31 '13 в 8:31 ч. 2013-10-21 08:31

Ако търсите алтернатива, за да напишете check-ugly -1, вместо да добавите ~ tilde.

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

Joe Zimmerman - ще видите, че използването на ~ on -1 го преобразува в 0. Числото 0 е невярно, което означава, че ще бъде изчислено като false, когато бъде преобразувано в boolean. В началото това може да не изглежда много силно, но не забравяйте, че функциите, като например indexOf, връщат -1, когато заявката не е намерена. Това означава, че вместо да пише нещо подобно:

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

Сега може да имате по-малко знаци в кода, така че да можете да пишете например:

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

Повече подробности тук

120
12 мая '14 в 1:22 2014-05-12 01:22 Отговорът е даден от Christian Landgren на 12 май, 14 в 1:22 2014-05-12 01:22

Тази част от кода трябва да работи добре:

 var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic } 
82
29 мая '12 в 10:46 2012-05-29 10:46 отговорът е даден от vaibhav на 29 май'12 в 10:46 ч. 2012-05-29 10:46

Общият начин да напишете метода contains в JavaScript

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

Операторът за битово отрицание ( ~ ) се използва, за да се превърне -1 в 0 (falsey), а всички останали стойности ще бъдат ненулеви (true).

Операторите с двойно булево отрицание се използват за превеждане на числа в логически.

77
13 сент. отговорът се дава zzzzBov 13 сеп . 2012-09-13 06:45 '12 в 6:45 ч. 2012-09-13 06:45

В ES5

76
08 авг. отговорът е даден Nisar 08 авг. 2015-08-08 14:44 '15 в 14:44 часа 2015-08-08 14:44

Вместо да използвате кодови фрагменти, намерени тук и там в Интернет, можете да използвате добре тествана и документирана библиотека. Две възможности, които бих препоръчал:


Вариант 1: Използвайте Lodash : той includes :

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

Lodash е най-популярната зависимост на JavaScript библиотеката за npm и има много полезни методи за JavaScript. Така че за много проекти все още искате това; -)


Вторият вариант: Или използвайте Underscore.string : има метод за include :

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

Тук е описанието на Underscore.string, то просто добавя 9kb, но ви дава всички предимства, които добре тествана и документирана библиотека има върху фрагментите code'n'paste code:

Underscore.string е JavaScript библиотека за лесно манипулиране на низове, разширение за Underscore.js, вдъхновено от Prototype.js, Right.js, Подчертаване и красив Ruby език.

Underscore.string ви предоставя няколко полезни функции: capize, clean, include, count, escapeHTML, unescapeHTML, insert, splicing, startWith, endsWith, headers, triming, cropping и др.

Имайте предвид, че Underscore.string е засегната от Underscore.js , но може да се използва и без нея.


Последно, но не на последно място: вграденият метод includes версия ES6 JavaScript:

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

Повечето съвременни браузъри вече го поддържат, обърнете внимание на таблицата за съвместимост на ES6 .

64
13 дек. Отговорът е даден на 13 ноември. 2013-12-13 23:05 '13 в 23:05 2013-12-13 23:05

Можете да използвате jQuery :contains селектора.

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

Забележете тук: contains-selector

63
14 марта '11 в 5:10 2011-03-14 05:10 отговорът е даден Chorinator 14 март, '11 в 5:10 ч. 2011-03-14 05:10

Използвайте редовен израз:

RegExp.test(string)

61
24 нояб. отговорът е даден на 24 ноември. 2009-11-24 16:13 '09 в 16:13 2009-11-24 16:13

Просто работи за мен. Той избира линии, които не съдържат думата "Изтрит:"

 if (eventString.indexOf("Deleted:") == -1) 
49
21 окт. отговор, даден writtinfool Окт 21. 2011-10-21 00:50 '11 в 0:50 2011-10-21 00:50

Друг начин да направите това е:

Можете да използвате функцията за съвпадение, тоест нещо като:

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

match () може да работи и с нормален израз:

 x = "teststring"; if (x.match(/test/i)) { // Code } 
49
29 сент. Отговор, даден от David Craig 29 септември 2012-09-29 13:40 '12 в 13:40 2012-09-29 13:40

Търсихте .indexOf MDN .

indexOf ще върне индекса на индекса. Индексът ще се свърже с мястото, където започва подстроката. Ако няма съвпадение, -1 се връща. Ето една проста демонстрация на тази концепция:

29 авг. Отговор, даден от Travis J 29 август. 2013-08-29 02:23 '13 в 2:23 2013-08-29 02:23

Трябва да извикате indexOf с капитала "O", както е посочено. Също така трябва да се отбележи, че в резервираната дума на JavaScript клас трябва да използвате className, за да получите този атрибут за данни. Причината, поради която е вероятно да се провали, е, че тя връща нулева стойност. Можете да направите следното, за да получите стойността на вашия клас ...

 var test = elm.getAttribute("className"); //or var test = elm.className 
48
24 нояб. Отговорът е даден от MillsJROSS 24 ноември 2009-11-24 18:52 '09 в 18:52 2009-11-24 18:52

Тъй като въпросът е доста популярен, мислех, че мога да добавя малко съвременен вкус към кода.

 // 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, правилният отговор е неправилен indexOf или нестандартни String.contains . Зареждането на външна библиотека (особено ако кодът е написан на чист javascript) или String.prototype с String.prototype или използването на регулярни изрази е твърде далеч.

34
27 окт. Отговор от Jay Harris 27 октомври 2013-10-27 18:53 '13 в 18:53 2013-10-27 18:53

Има елегантен и по-добър начин да направите това и той използва оператора (BitWise NOT).

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

Побитовите не превръщат "x" в - (x + 1), така че ако x се получи -1 от метода indexOf, тогава той ще се преобразува в - (-1 + 1) = -0, което е невярна стойност.

27
07 дек. Отговорът е даден Киба 07 декември. 2014-12-07 14:05 '14 в 14:05 2014-12-07 14:05

String.prototype.indexOf() или String.prototype.search() ?!

Както вече споменахме, низовете на JavaScript имат както indexOf и search .

Основната разлика между двете е, че indexOf използва само за прости подстрани, докато search също поддържа регулярни изрази. Разбира се, предимството на използването на indexOf е, че е по-бързо.

Вижте също В JavaScript, каква е разликата между indexOf () и търсенето ()? ,

Прилагане на собствен метод String.prototype.contains()

Ако искате да добавите свой собствен contains метод към всеки ред, най-добрият начин да направите това е @zzzzBov :

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

Ще го използвате, както следва:

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

Прилагане на потребителска програма

Обикновено не се препоръчва да добавяте свои собствени методи към стандартни обекти в JavaScript, например, защото това може да наруши съвместимостта.

Ако наистина имате нужда от свой собствен метод и / или други потребителски низови методи, по-добре е да създадете собствена библиотека на помощната програма и да добавите свои собствени низови методи към тази библиотека:

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

Ще го използвате, както следва:

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

Използване на помощна библиотека на трета страна

Ако не искате да създадете собствена поддържаща библиотека, винаги има възможност да използвате библиотека на трети страни. Както бе споменато @nachtigall , най-популярни са Lodash и Underscore.js .

В Lodash можете да използвате _.includes() , които използвате, както следва:

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

В Underscore.js можете да използвате _.str.include() , който използвате, както следва:

 _.str.include('Hello World', 'orl'); 
24
21 февр. Отговор, даден от John Slegers 21 февруари. 2016-02-21 19:52 '16 в 19:52 2016-02-21 19:52

Най-простото решение

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

Можете да използвате както следва

 "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 авг. отговор, даден от Sriramajeyam Sugumaran 21 Aug. 2015-08-21 12:45 '15 в 12:45 ч. 2015-08-21 12:45
22
08 нояб. отговорът е даден от user663031 08 ноември. 2014-11-08 08:38 '14 в 8:38 ч. 2014-11-08 08:38

пример

 var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found } 
22
12 нояб. Отговор, даден от Али Абас на 12 ноември 2015-11-12 16:11 '15 в 16:11 2015-11-12 16:11

Кодът на JavaScript за използване на метода contains в масив:

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

В този код методът contains дали посоченият елемент присъства в масива или не. Ако посоченият елемент присъства в масива, той връща true, в противен случай връща false.

21
28 февр. Отговорът е даден от Тарун Гупта на 28 февруари. 2013-02-28 10:50 '13 в 10:50 2013-02-28 10:50

За да съберете някои валидни решения:

19
16 июня '15 в 15:08 2015-06-16 15:08 отговорът е даден shA.t 16 юни '15 в 15:08 2015-06-16 15:08

Тъй като има оплакване за използването на прототипа, и тъй като използването на indexOf прави вашия код по-малко четлив и тъй като regexp е пълен:

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

Това е компромис, който имам.

17
22 авг. отговорът е даден Tjaart 22 aug. 2013-08-22 14:40 '13 в 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 дек. Отговорът е даден от Ален Готие 16 декември. 2014-12-16 19:48 '14 в 19:48 2014-12-16 19:48

Използвайте вградения и най-простия низ, т.е. match() в низ. За да постигнете това, което очаквате, направете следното:

 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 отговорът е даден от Ankur Madaan 02 май '14 в 23:08 2014-05-02 23:08

Най-лесният начин е да се използва indexOf . За да проверите string за substr , можете да използвате този метод:

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

Тъй като имате нужда от string.contains() , можете да я реализирате както следва:

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

Сега можете да използвате този по-кратък метод, за да проверите дали даден низ съдържа специален подстрока:

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

Тук е JSFiddle .

13
27 мая '14 в 15:52 2014-05-27 15:52 отговорът е даден от frieder на 27 май'14 в 15:52 2014-05-27 15:52
  • 1
  • 2

Други въпроси, свързани с за тагове, или задаване на въпрос