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

Обычной операцией во многих языках программирования является проверка, содержит ли строка другую строку. Хотя это простая и распространенная задача, названия методов в разных языках программирования часто различаются. Например, вот небольшой пример методов, используемых для этого на разных языках: * Java: String.contains (), String.indexOf () и т. Д. * Python: оператор in, String.index (), String. find () * Перейти: strings.Contains () * Ruby: string.include? Вы уловили суть. Есть миллион способов сделать это

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

  • Java: String.contains() , String.indexOf() и т. Д.
  • Python: оператор in String.index() , String.find()
  • Перейти: strings.Contains()
  • Рубин: string.include?

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

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

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

Метод 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 символах (или вы просто не хотите, чтобы она соответствовала этим символам), вы можете использовать следующий метод:

 str.includes(substr, 50); 

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

Метод String.indexOf()

Метод String.indexOf() очень похож на предыдущий includes() (и его также можно использовать в полифилле для 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) { 
 console.log('Found the substring!'); 
 } 

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

Регулярное выражение

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

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

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

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

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

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

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

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

Заключение

Управление и проверка строк - одна из наиболее распространенных задач, выполняемых во многих языках программирования, особенно с пользовательским кодом. По разным причинам, например для проверки строк, вам необходимо проверить, содержит ли строка подстроку. В этой статье мы увидели несколько различных методов, предоставляемых JavaScript, которые позволяют вам делать именно это.

comments powered by Disqus