Javascript есть в строке

JavaScript: Как проверить, содержит ли строка подстроку

Обычной операцией во многих языках программирования является проверка, содержит ли строка другую строку. Хотя это простая и распространенная задача, имена методов часто различаются в разных языках программирования. Например, вот небольшой пример методов, используемых для достижения этого на разных языках:

  1. Java: String.contains() , String.indexOf() и т.д.
  2. Python: оператор in , String.index() , String.find()
  3. Go: strings.Contains()
  4. Ruby: string.include?

Смысл должен быть понятен. Есть миллион способов сделать это, и кажется, что каждый язык реализует это по-своему.

В любом случае, давайте посмотрим, как можно проверить, содержит ли строка подстроку в JavaScript.

Первые два метода, показанные ниже, также работают с массивами, которые сообщают вам, содержит ли массив заданное значение (или его индекс). Помните об этом при чтении статьи, так как она, вероятно, поможет вам в подобных случаях.

String.includes()

Этот метод был введен в ES6 и обычно является предпочтительным методом для простых случаев использования. Если все, что вам нужно сделать, это получить логическое значение, указывающее, находится ли подстрока в другой строке, то это то, что вы хотите использовать.

> let str = 'stackabuse'; > let substr = 'stack'; > str.includes(substr); true 

Как видите, возвращается логическое значение, поскольку строка «stack» является подстрокой «stackabuse».

Это поиск с учетом регистра, поэтому следующее не будет соответствовать подстроке:

> let str = 'StackAbuse'; > let substr = 'stack'; > str.includes(substr); false 

Хотя этого достаточно для большинства случаев использования, метод includes() также предоставляет другой вариант, который может быть полезен для вас. Может быть предоставлен второй аргумент, который сообщает методу, с какого индекса начинать поиск. Поэтому, если вы знаете, что подстрока не содержится в первых 50 символах (или вы просто не хотите, чтобы она соответствовала этим символам), то вы можете использовать метод, подобный следующему:

Читайте также:  Php конкатенация элементов массива

Смещение ниже 0 просто начинает поиск с индекса 0, а смещение больше, чем string.length , возвращает false , поскольку поиск начинается с string.length .

String.indexOf()

Метод String.indexOf() очень похож на includes() (и его также можно использовать в polyfill includes() ), но единственное отличие — это возвращаемое значение. Вместо того, чтобы возвращать логическое значение, указывающее наличие подстроки, он фактически возвращает индексное местоположение подстроки, или -1, если его нет.

> let str = 'stackabuse'; > let substr = 'abuse'; > str.indexOf(substr); 5 > str.indexOf('apple'); -1

Как видите, этот метод возвращает позицию индекса подстроки, начинающуюся с на 0, и -1, если подстрока не была найдена.

Как и метод includes() , indexOf() чувствителен к регистру и также поддерживает параметр смещения:

> let str = 'StackAbuse'; > let substr = 'abuse'; > str.indexOf(substr); -1 > str.indexOf('Abu', 3); 5 > str.indexOf('Abu', 6); -1 

Этот метод полезен, когда вам нужно знать точное местоположение подстроки, однако он не так чист, когда просто используется как логическое значение:

let str = 'stackabuse'; let substr = 'stack'; if (str.indexOf(substr) > -1)

В таких случаях вы должны использовать метод includes() , поскольку он более подвержен ошибкам.

Regex

Одним из наиболее полезных и мощных способов проверки подстроки является использование регулярных выражений. Использование регулярных выражений для такой задачи дает вам гораздо больше гибкости, чем в предыдущих методах, где вы можете проверять только постоянную строку. Несмотря на то, что регулярное выражение является слишком большой темой, чтобы полностью охватить здесь, мы можем по крайней мере взглянуть на некоторые полезные функции для нашего варианта использования.

Проверка на наличие подстрок в строке с регулярным выражением может быть выполнена с помощью метода RegExp.test() :

> let str = 'stackabuse'; > /stack/.test(str); true 

В отличие от двух предыдущих методов, теперь мы можем выполнять поиск без учета регистра с флагом i :

> let str = 'StackAbuse'; > /stack/i.test(str); true 

В качестве более сложного примера, скажем, вы хотите увидеть, содержит ли строка почтовый индекс (5-значный почтовый индекс), но вам не важно, какой почтовый индекс находится в строке. Такую проблему нельзя решить с помощью includes() или indexOf() . Но с помощью регулярных выражений мы можем легко проверить это:

> let str = 'My zip code is 90210'; > /\d/.test(str); true > str = 'My address is 123 Fake St.'; > /\d/.test(str); false 

Не смотря на то что JavaScript не такой быстрый как например C, в некоторых случаях время выполнения скрипта может быть критичным. В этом случае RegEx лучше заменить на более простой и легковесный метод includes() .

Читайте также:  Python передать массив функцию

Источник

String.prototype.includes()

Метод includes() проверяет, содержит ли строка заданную подстроку, и возвращает, соответственно true или false .

Синтаксис

str.includes(searchString[, position])

Параметры

Строка для поиска в данной строке.

Позиция в строке, с которой начинать поиск строки searchString , по умолчанию 0.

Возвращаемое значение

true , если искомая строка была найдена в данной строке; иначе false .

Описание

Этот метод позволяет вам определять, содержит ли строка другую строку.

Чувствительность к регистру символов

Метод includes() является регистрозависимым. Например, следующее выражение вернёт false :

'Синий кит'.includes('синий'); // вернёт false 

Примеры

Использование includes()

var str = 'Быть или не быть вот в чём вопрос.'; console.log(str.includes('Быть')); // true console.log(str.includes('вопрос')); // true console.log(str.includes('несуществующий')); // false console.log(str.includes('Быть', 1)); // false console.log(str.includes('БЫТЬ')); // false 

Полифил

Этот метод был добавлен в спецификации ECMAScript 2015 и может быть недоступен в некоторых реализациях JavaScript. Однако, можно легко эмулировать этот метод:

if (!String.prototype.includes)  String.prototype.includes = function(search, start)  'use strict'; if (typeof start !== 'number')  start = 0; > if (start + search.length > this.length)  return false; > else  return this.indexOf(search, start) !== -1; > >; > 

Спецификации

Поддержка браузерами

BCD tables only load in the browser

String.prototype.contains

В Firefox с версии 18 по версию 39, этот метод назывался «contains». Он был переименован в «includes» в замечании баг 1102219 по следующей причине:

Как было сообщено, некоторые сайты, использующие MooTools 1.2, ломаются в Firefox 17. Эта версия MooTools проверяет существование метода String.prototype.contains() и, если он не существует, добавляет свой собственный. С введением этого метода в Firefox 17, поведение этой проверки изменилось таким образом, что реализация String.prototype.contains() , основанная на MooTools, сломалась. В результате это изменение было отключено в Firefox 17. Метод String.prototype.contains() доступен в следующей версии Firefox — Firefox 18.

MooTools 1.3 принудительно использует свою собственную версию метода String.prototype.contains() , так что использующие его веб-сайты не должны ломаться. Тем не менее, следует отметить, что сигнатура метода в MooTools 1.3 отличается от сигнатуры метода в ECMAScript 2015 (во втором аргументе). В MooTools 1.5+ сигнатура изменена для соответствия стандарту ES2015.

В Firefox 48, метод String.prototype.contains() был удалён. Следует использовать только String.prototype.includes() .

Смотрите также

  • Array.prototype.includes() Экспериментальная возможность
  • TypedArray.prototype.includes() (en-US) Экспериментальная возможность
  • String.prototype.indexOf()
  • String.prototype.lastIndexOf()
  • String.prototype.startsWith()
  • String.prototype.endsWith()

Found a content problem with this page?

This page was last modified on 22 окт. 2022 г. by MDN contributors.

Источник

Оцените статью