Содержит ли строка заданную подстроку?

284
18 марта 2017, 02:17

Каким способом можно определить что в строке есть искомый текст?

Перевод вопроса "How to check whether a string contains a substring in JavaScript?"

Answer 1

Способов, на самом деле, достаточно много:

  1. String#indexOf(str: String[, fromIndex: Number]): Number - один из старейших способов.

    Возвращает найденную позицию str или, если подстрока не найдена, -1.
    Параметр fromIndex определяет отступ поиска.

    Важно: В условии необходимо использовать сравнение и обязательно строгое:

    1. Без сравнения, -1 (отсутствие подстроки) трактуется как true.
    2. Может возвращать 0 (совпал первый символ), что приводится обычным сравнением к false.

      'Hello, world!'.indexOf('world'); // 7
      'Hello, world!'.indexOf('o');     // 4, в конце hello
      'Hello, world!'.indexOf('o', 5);  // 8, вторая буква в world
      !!'Hello, world!'.indexOf('z');   // true, отрицательное число приводится к true
      !!'Hello, world!'.indexOf('H');   // false, 0 трактуется как false  
      
  2. String#search([regexp: RegExp]): Number - тот же String#indexOf, только с регулярным выражением и отсутствием смещения.

    "Date of birth of Einstein: 3/14/1879".search(/\d{4}/); // 32
    
  3. String#includes(searchString: String[, position: Number]): Boolean - более кошерный вариант String#indexOf с двумя отличиями:

    1. Возвращает Boolean, вместо позиции, что может быть более ожидаемым.
    2. Работает быстрее. Однако разница ощутима только на весьма больших объёмах, проверить.

      'Hello, world!'.includes('o');    // true, в конце hello
      'Hello, world!'.includes('o', 9); // false, после девятого символа нет 'o'
      
  4. String#match(regexp: RegExp): Array | Null - String#search на стероидах (однако, медленнее).

    Возвращает немного модифицированный массив с найденной подстрокой, позицией совпадения (index) и свойством input - строкой, в котором проходил поиск или Null, если регулярка ничего не нашла.
    Опционально, в массиве могут быть захваченные группы.
    При использовании флага g, вернутся все найденный совпадения (правда без групп и особых свойств):

    "Date of birth of Einstein: 3/14/1879".match(/(\d{4})/);                       // [0: "1879", 1: "1879", index: 32, input: "Date of birth of Einstein: 3/14/1879", length: 2]
    `Date of birth of Einstein: 3/14/1879;
    Date of birth of Hendrik Lorentz: 7/18/1853`.match(/(\d)\/(\d{2})\/(\d{4})/g); // [0: "3/14/1879", 1: "7/18/1853", length: 2]
    

Есть ещё методы RegExp#test или RegExp#exec, который так же могут быть использованы для проверки, но это уже совсем другая история.

READ ALSO
Как разобрать выражение js

Как разобрать выражение js

Как работает эта странная конструкция на js ?

302
Добавление меток Я.карт по дата атрибутам

Добавление меток Я.карт по дата атрибутам

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

327
Js сформировать параметр

Js сформировать параметр

Как сформировать такой параметр 'status' : 1 в переменную get? Сейчас $_POST выглядит так

206
Как имитировать заход на сайт

Как имитировать заход на сайт

Допустим есть сайт, я там зарегистрирован:

418