Як перевірити, чи містить рядок підрядок в JavaScript?

Зазвичай я очікував би String.contains() , але, схоже, його немає.

Який розумний спосіб перевірити це?

7436
24 нояб. заданий gramm 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. lodash включає - перейдіть до відповіді

 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 2009-12-30 7:23

Проблема з вашим кодом полягає в тому, що JavaScript чутливий до регістру. виклик методу

 indexof() 

повинен бути

 indexof() 

Спробуйте його виправити і подивіться, чи допомагає це:

 if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; } 
429
24 нояб. відповідь дан Victor 24 нояб. 2009-11-24 17:17 '09 о 17:17 2009-11-24 17:17

Існує string.includes в ES6 :

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

Зверніть увагу, що вам може знадобитися завантажити es6-shim або аналогічний, щоб це працювало в старих браузерах.

 require('es6-shim') 
361
07 янв. відповідь дан eliocs 07 Січня. 2013-01-07 13:23 '13 о 13:23 2013-01-07 13:23
 var index = haystack.indexOf(needle); 
341
24 нояб. відповідь дан pixeline 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 відповідь дан Tardis 05 березня '10 о 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 8:31

Якщо ви шукали альтернативу для написання чек-потворного -1, замість цього ви додаєте ~ тильду.

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

Джо Циммерман - ви побачите, що використання ~ on -1 перетворює його в 0. Число 0 є значення false, що означає, що він буде обчислюватися як false при перетворенні в булево. Спочатку це може здатися не дуже сильним, але пам'ятайте, що функції, такі як 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 1: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), а всі інші значення будуть відмінними від нуля (правда).

Оператори з подвійним булевим запереченням використовуються для перекладу числа в логічне.

77
13 сент. відповідь дан zzzzBov 13 сент. 2012-09-13 06:45 '12 о 6:45 2012-09-13 6: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, але дає вам всі переваги, які добре протестована і документована бібліотека має над фрагментами коду copy'n'paste:

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

Underscore.string надає вам кілька корисних функцій: capize, чистий, включає, count, escapeHTML, unescapeHTML, вставку, зрощування, startsWith, endsWith, заголовки, обрізка, обрізання і т.д.

Зверніть увагу, що на Underscore.string впливає Underscore.js , але може використовуватися без нього.


Останнє не найменше: З версією JavaScript ES6 поставляється вбудований метод includes :

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

Більшість сучасних браузерів вже підтримують його, зверніть увагу на таблицю сумісності ES6 .

64
13 дек. відповідь дан nachtigall 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 5:10

Використовуйте регулярний вираз:

RegExp.test(string)

61
24 нояб. відповідь дан rahul 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 2: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'); HTMLCollection // 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 або з використанням регулярного виразу трохи переборщив.

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 дек. відповідь дан Kiba 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 () і search ()? .

Впровадження власного методу String.prototype.contains()

Якщо ви хочете додати свій власний метод contains до кожного рядка, найкращим способом зробити це буде @zzzzBov :

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

Ви б використовували його в такий спосіб:

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

Реалізація користувальницької утиліти

Зазвичай не рекомендується додавати власні методи до стандартних об'єктів в JavaScript, наприклад, тому що це може порушити сумісність.

Якщо вам дійсно потрібен власний метод contains і / або інші настроюються рядкові методи, краще створити свою власну бібліотеку утиліти і додати в цю бібліотеку свої власні строкові методи:

 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

23
21 авг. відповідь дан Sriramajeyam Sugumaran 21 Серпня. 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 8:38

приклад

 var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found } 
22
12 нояб. відповідь дан Ali Abbas 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> 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> 

В даному коді метод contains визначає, чи присутній вказаний елемент в масиві чи ні. Якщо зазначений елемент присутній в масиві, він повертає true, інакше він повертає false.

21
28 февр. відповідь дан Tarun Gupta 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 Серпня. 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 дек. відповідь дан Alain Gauthier 16 дек. 2014-12-16 19:48 '14 о 19:48 2014-12-16 19:48

Використовуйте вбудовану і найпростішу рядок ie 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"); } and if not returns null 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; }; 

Тепер ви можете використовувати цей метод ecen shorter, щоб перевірити, чи містить рядок спеціальну подстроку:

 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

Інші питання по мітках або Задайте питання