Самый быстрый способ проверить строку, содержащую другую подстроку в JavaScript?

Я работаю с проблемой производительности на JavaScript. Поэтому я просто хочу спросить: какой самый быстрый способ проверить, содержит ли строка другую подстроку (мне просто нужно логическое значение)? Не могли бы вы предложить свою идею и пример кода фрагмента?

вопрос задан 14.03.2011
Đinh Hồng Châu
1968 репутация

7 ответов


  • 257 рейтинг

    У вас есть две возможности:

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

      (new RegExp('word')).test(str)
      // or
      /word/.test(str)
      
    2. indexOf :

      str.indexOf('word') !== -1
      

    Регулярные выражения кажутся быстрее (по крайней мере, в Chrome 10).

    Тест производительности - короткий стог сена
    Тест производительности - длинный стог сена


    Обновление 2011 года:

    Нельзя с уверенностью сказать, какой метод быстрее. Различия между браузерами огромны. В то время как в Chrome 10 indexOf кажется более быстрым, в Safari 5 indexOf явно медленнее, чем любой другой метод.

    Вы должны увидеть и попробовать себя. Это зависит от ваших потребностей. Например, регистронезависимый поиск намного быстрее с регулярными выражениями.


    Обновление 2018:

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

    Хром: indexOf (~ 98% быстрее) <-- wow
    Firefox: кэшированный RegExp (~ 18% быстрее)
    IE11: , кэшированный RegExp (~ 10% быстрее)
    Edge: indexOf (~ 18% быстрее)
    Safari: , кэшированный RegExp (~ 0. На 4% быстрее)

    Обратите внимание, что в кеше RegExp : var r = new RegExp('simple'); var c = r.test(str);, а не: /simple/.test(str)

    .
    ответ дан Felix Kling, с репутацией 527773, 14.03.2011
  • 17 рейтинг

    Это работает для вас?

    string1.indexOf(string2) >= 0
    

    Редактировать: Это не может быть быстрее, чем RegExp, если строка2 содержит повторяющиеся шаблоны. В некоторых браузерах indexOf может быть намного медленнее, чем RegExp. Смотрите комментарии.

    Редактировать 2: RegExp может быть быстрее, чем indexOf, когда строки очень длинные и / или содержат повторяющиеся шаблоны. Смотрите комментарии и ответ @ Феликса.

    ответ дан Stephen Chung, с репутацией 13331, 14.03.2011
  • 8 рейтинг

    Я обнаружил, что использование простого цикла for, итерации по всем элементам в строке и сравнение с использованием charAt выполняется быстрее, чем indexOf или Regex. Код и подтверждение доступны по адресу JSPerf .

    ETA: indexOf и charAt работают одинаково ужасно на Chrome Mobile в соответствии с данными Области браузера, перечисленными на jsperf. com

    ответ дан wpg4665, с репутацией 108, 17.09.2013
  • 6 рейтинг

    В ES6 метод includes() используется для определения, может ли одна строка быть найдена в другой строке, возвращая true или false в зависимости от ситуации.

    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('nonexistent')); // false
    

    Вот jsperf между

    var ret = str.includes('one');
    

    и

    var ret = (str.indexOf('one') !== -1);
    

    Как показывает результат, показанный в jsperf, кажется, что оба они работают хорошо.

    ответ дан zangw, с репутацией 21935, 23.02.2016
  • 3 рейтинг

    Для поиска простой строки с помощью метода indexOf () и с помощью регулярных выражений практически то же самое: http: // jsperf. com / substring - так что выбирайте тот, который кажется легче написать.

    ответ дан Chii, с репутацией 11382, 14.03.2011
  • 2 рейтинг

    Я сделал jsben. ch для вас http: // jsben. ch / # / aWxtF . , , кажется, что indexOf немного быстрее.

    ответ дан EscapeNetscape, с репутацией 1439, 21.10.2016
  • 1 рейтинг

    Это простой способ использовать метод .match() для строк.

    var re = /(AND|OR|MAYBE)/;
    var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
    console.log('Do we found something?', Boolean(str.match(re)));
    

    Желаю вам хорошего дня, сэр!

    ответ дан Anton Danilchenko, с репутацией 1676, 5.09.2013