Як перевірити, чи містить рядок підрядок в JavaScript?
Зазвичай я очікував би String.contains()
, але, схоже, його немає.
Який розумний спосіб перевірити це?
- 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
може бути кращим вибором, якщо справа доходить до того, що швидкість має значення.
Ви можете легко додати метод 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; }; }
Проблема з вашим кодом полягає в тому, що JavaScript чутливий до регістру. виклик методу
indexof()
повинен бути
indexof()
Спробуйте його виправити і подивіться, чи допомагає це:
if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; }
"potato".includes("to"); > true
Зверніть увагу, що вам може знадобитися завантажити es6-shim
або аналогічний, щоб це працювало в старих браузерах.
require('es6-shim')
var index = haystack.indexOf(needle);
Ви можете використовувати метод JavaScript search()
.
Синтаксис: string.search(regexp)
Повертає позицію збігу або -1, якщо збіг не знайдено.
Див. Приклади: jsref_search
Вам не потрібен складний синтаксис регулярних виразів. Якщо ви не знайомі з ними, це зробить простий st.search("title")
. Якщо ви хочете, щоб ваш тест був нечутливим до регістру, ви повинні зробити st.search(/title/i)
.
String.prototype.includes()
був введений в ES6.
Визначає, чи може один рядок бути знайдена в іншому рядку, повертаючи true або false відповідно.
синтаксис
var contained = str.includes(searchString [, position]);
параметри
searchString
Рядок, яку потрібно шукати всередині цього рядка.
position
Позиція в цьому рядку, в якій потрібно починати пошук searchString
за замовчуванням 0.
приклад
167
Якщо ви шукали альтернативу для написання чек-потворного -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 }
Детальніше докладніше тут
Ця частина коду повинна добре працювати:
var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic }
Загальний спосіб запису методу contains
в JavaScript :
if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; }
Оператор побітового заперечення ( ~
) використовується, щоб перетворити -1
в 0
(falsey), а всі інші значення будуть відмінними від нуля (правда).
Оператори з подвійним булевим запереченням використовуються для перекладу числа в логічне.
У ES5
76
Замість використання фрагментів коду, знайдених тут і там в Інтернеті, ви також можете використовувати добре протестовану і задокументовану бібліотеку. Два варіанти, які я б рекомендував:
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 .
Ви можете використовувати селектор jQuery :contains
.
$("div:contains('John')")
Відзначте тут: contains-selector
Використовуйте регулярний вираз:
Це просто спрацювало для мене. Він вибирає рядки, які не містять термін "Вилучено:"
if (eventString.indexOf("Deleted:") == -1)
Інший спосіб зробити це:
Ви можете використовувати функцію відповідності, тобто щось на зразок:
x = "teststring"; if (x.match("test")) { // Code }
match () також може працювати з регулярним виразом:
x = "teststring"; if (x.match(/test/i)) { // Code }
Ви шукали .indexOf
MDN .
indexOf
буде повертати індекс підрядковий підрядку. Індекс буде корелювати з тим, де починається підрядок. Якщо збігу немає, повертається -1. Ось проста демонстрація цієї концепції:
49
Вам потрібно викликати indexOf з капіталом "O", як зазначено. Слід також зазначити, що в класі JavaScript зарезервоване слово, ви повинні використовувати className для отримання цього атрибута даних. Причина, по якій він, ймовірно, зазнає невдачі, полягає в тому, що він повертає нульове значення. Ви можете зробити наступне, щоб отримати кількість написаних вами класу ...
var test = elm.getAttribute("className"); //or var test = elm.className
Оскільки питання досить популярний, я подумав, що можу додати в код трохи сучасний аромат.
// 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
або з використанням регулярного виразу трохи переборщив.
Існує гладкий і кращий спосіб зробити це, і він використовує оператор (BitWise NOT).
if(~"John".indexOf("J")) { alert("Found") } else { alert("Not Found"); }
Побітовое НЕ перетворює "x" в - (x + 1), тому, якщо x виходить -1 з методу indexOf, то він буде перетворений в - (-1 + 1) = -0, що є помилковим значення.
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');
Найпростіше обхідний рішення
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
ES6 містить String.prototype.includes
.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
приклад
var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found }
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.
Щоб зібрати якісь допустимі рішення:
19
Так як є скарга на використання прототипу, і оскільки використання indexOf
робить ваш код менш читабельним і оскільки regexp переповнений:
function stringContains(inputString, stringToFind) { return (inputString.indexOf(stringToFind) != -1); }
Це компроміс, в який я потрапив.
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
Використовуйте вбудовану і найпростішу рядок 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 nullvar 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"); }
Найпростіший спосіб - використовувати 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 .
- 1
- 2
Інші питання по мітках javascript string substring contains string-matching або Задайте питання