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


Зазвичай я б очікував a String.contains() метод, але, здається, не є таким.

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


7436
2017-11-24 13:05


походження


Це легко за допомогою методу indexOf, ви можете побачити підручник indexOf та підрядів тут: dreamsyssoft.com/javascript-shell-scripting/... - Triton Man
можливий дублікат Стрічка JQuery містить чек - Saswat
Ви можете побачити швидкість r.indexOf(s) !== -1; швидше, ніж інші. hayageek.com/javascript-string- містить - Sherali Turdiyev
Тут є еталон для найпоширеніших способів перевірки, чи є рядок у рядку: jsben.ch/#/o6KmH - EscapeNetscape
Відео, що охоплює найкращі варіанти нижче <5 хвилин, тут: youtube.com/watch?v=KENPi0xTgcE - ssmith


Відповіді:


Ось список поточних можливостей:

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 може бути кращим вибором, якщо справа доходить до того моменту, коли важливо швидкість.


11489
2017-12-30 04:23



@Steve indexOf завжди повертає число, тому немає потреби користуватися !==. Якщо ви хочете зберегти байти, ви можете використовувати ~'foo'.indexOf('oo') який повертає truey значення, якщо підстрока знайдена, і фальшиве значення (0), якщо це не так. - Mathias Bynens
Для допитливого: у двох компліментних системах -1 у двоичному вигляді представлено всі 1s (1111 1111 1111 1111 1111 1111 1111 1111 1111 для 32 біт). Побітовий зворотний (~) це все нулі, або просто нуль, а значить, фальс. Ось чому трюк шпигунів працює, і це дуже погано, якщо я повинен це сказати сам. - Adam Tolley
@ SebNilsson Ви забули включити ~ Оператор, який я запропонував у моєму коментарі. ~'hello'.indexOf('h'); // -1, which is truthy, але ~'hello'.indexOf('x'); // 0, which is falsy. - Mathias Bynens
@ pramodc84, що посилання відноситься до Array об'єкт indexOf метод не в String об'єктний метод - gion_13
@NicolasBarbulesco Я впевнений, що всі люди, які дивляться на мій код, це знають [["\t\n 987654321e-400"]] === 0 є помилковим Я набагато менше впевнений, що кожен, хто подивиться на мій код, це знає [["\t\n 987654321e-432"]] == 0 правда. - kybernetikos


Ви можете легко додати contains Метод String за допомогою цієї заяви:

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

Примітка: перегляньте коментарі нижче, щоб отримати допустимий аргумент, щоб не використовувати це. Моя порада: користуйся своїм власним судженням.

Альтернативно:

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

823
2017-11-24 14:17



Не змінюйте об'єкти, які ви не володієте. nczonline.net/blog/2010/03/02/... - zachleat
@ zachleat, що зрозуміло на практиці. Але "foobar" .contains ("bar") буде дійсно корисним винятком з правила. - ndbroadbent
Ех, моя перевага полягатиме в тому, щоб адаптувати мою психічну модель до JavaScript і просто використовувати indexOf. Це полегшить розуміння коду для наступного сценарію JavaScripter, який повинен з'явитись і повинен його прочитати. - zachleat
if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } - Pavel Hodek
Я це краще використовувати цю функцію, якщо ви збираєтеся використовувати цей тип indexOf часто. @zachleat, я б не погодився, що використання indexOf більш читабельно, ніж містить. Містить описує, що відбувається, де десь indexOf() != -1 може бути не таким прозорим. Але для кожного їхнього, до тих пір, поки ви будете сумісними. - smdrager


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

indexof()

повинен бути насправді

indexOf()

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

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

429
2018-01-07 10:23



@JeremyW, я б сказав, що на даний момент цією відповіддю є те, що люди, які зробили ту саму помилку (indexof замість indexOf) можете знайти цю відповідь і подивитися, що відбувається. Я б більше не торкався цього питання. - Victor


Є а string.includes в ES6:

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

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

require('es6-shim')

361
2017-11-24 13:06



тому що я звик «містив» в інших мовах і просто реалізував мою функцію з ним, я просто вдалася до помилки. Отже, короткі відгуки про підтримку. Firefox 19 - OSX => Добре, Firefox 19 - Windows => NOK, Chrome - OSX, Windows => NOK - Patrick Hammer
Подобається це? String.prototype.contains = function (segment) { return this.indexOf(segment) !== -1; }; (BTW: робити речі на прототипі погано) - Nijikokun
Це не підтримка в хроме ..... - Krunal Patel
@Norris Це в ES6. Завантажте ES6 shim. Ви можете використовувати його зараз. - mikemaccana
.Contains () і .includes () є експериментальними, re: нестандартними. Я б не рекомендував їх використовувати у виробничих системах. Я б дотримуватися .indexOf () зараз. - Mike S.


var index = haystack.indexOf(needle);

341
2018-03-05 09:53





Ви можете використовувати JavaScript search() метод

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

Вона повертає позицію матчу, або -1, якщо не знайдено відповідності.

Див. Приклади тут: jsref_search

Вам не потрібен складний синтаксис регулярних виразів. Якщо ви не знайомі з ними просто st.search("title") зроблю. Якщо ви хочете, щоб ваш тест був нечутливим до регістру, тоді ви повинні зробити це st.search(/title/i).


237
2017-10-21 05:31



Схоже, що це буде повільніше, ніж функція indexOf, оскільки йому доведеться проаналізувати RegEx. Однак, якщо ви хочете, щоб щось нечутливо було до речі, ваш шлях буде шлях (я думаю), хоча цього не було, що було задано. Хоча це і не було задано, я голосую про це просто  оскільки варіанта бездокументарності випадку. - bgw
Я не запустив тест, але це буде str.toLowerCase().indexOf(searchstr.toLowerCase()) бути набагато ефективнішим для безін'єктивного пошуку? - Tim S.
З контролем і, виявляється, пошук є більш ефективним для бездокументарного пошуку. jsperf.com/string-compare-perf-test Але це може бути складно використовувати пошук регулярних викликів, оскільки вам потрібно уникнути деяких символів. - misaxi
Пошук може призвести до помилок. Як сказав майсасі, тоді вам доведеться уникнути деяких персонажів. Я використав пошук, не розуміючи, що параметр очікував regex, і шукав символ труби. Як виявляється, будь-який рядок .search ('|') == 0. - James Foster
Ви можете використовувати функцію escapeRegExp, щоб безпечний текст тексту. function escapeRegExp(string){ return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); } від developer.mozilla.org/en/docs/Web/JavaScript/Guide/... - Mark


String.prototype.includes() був введений в ES6.

Визначає, чи може бути знайдена одна рядок в іншій рядку   повернення істинної чи фальшивої, як доречно.

Синтаксис

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

Параметри

searchString

Строка, яку потрібно шукати у цьому рядку.

position

Позиція в цьому рядку, на якій починати пошук searchString за замовчуванням 0.

Приклад

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  

Примітка

Для цього може знадобитися ES6 shim у старших браузерах.


167
2018-05-29 07:46



FWIW пов'язана сторінка MDN має просту накладку / поліфайл: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Salman Abbas


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

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

Джо Циммерман - ви побачите, що за допомогою ~ на -1 перетворюється на 0. Кількість 0 - це a   хибне значення, що означає, що він буде оцінюватися як хибний при перетворенні в   булевий Це може здатися не зовсім великим розумінням спочатку, але   запам'ятати функції, такі як indexOf поверне -1, коли запит не буде   знайдено Це означає, що замість того, щоб написати щось подібне до цього:

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

Тепер у вашому коді може бути менше символів, щоб ви могли його записати   подобається це:

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

Більше деталі тут


120
2017-09-13 03:45



Так, тепер я краще рекомендую заповнити стандарт ES6 includes() виконавши таке: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Christian Landgren


Цей фрагмент коду має працювати добре.

var str="This is testing for javascript search !!!";
if(str.search("for") != -1) {
   //logic
} 

82
2017-12-13 20:05



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


Звичайний спосіб написати contains метод у JavaScript це:

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

Оператор побітового заперечення (~) використовується для повороту -1 в 0 (фальшивий), і всі інші значення будуть ненульовими (truthy).

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


77
2018-03-14 02:10



Яка перевага !!~ над >-1? - alex
@alex, немає ніякої особливої ​​переваги, крім того, що не покладаються на магічні цифри. Використовуйте те, що вам зручно. - zzzzBov
@zzzzBov! ~~ точно так само спирається на магічне число -1 і на те, що його побічне уявлення доповнює 0. - Martijn
!!~this.indexOf(arg); це не легко зрозуміло і не так ясно в контексті, скільки воно має бути. Це також реле про факт ~-1 0, узгоджено з @Martijn. Також це повільніше, ніж просто порівняння з -1. Але ясність є головним фактором. - babinik
@ Нік, я ніколи не стверджував, що це був добре До речі, я просто сказав, що це був загальний шлях Що стосується чіткості, я вважаю, що це розумний спосіб зберегти кілька байтів для бібліотеки, але я, як правило, використовую foo.indexOf('bar') > -1 - zzzzBov