string-matching - string js - Как проверить,содержит ли строка подстроку в JavaScript?

js substring from end / javascript / string / substring

Обычно я ожидал бы String.contains() , но, похоже, его нет.

29 revs, 19 users 18%



Answer #1

Вот реализация JavaScript в Project Nayuki, взятая из https://www.nayuki.io/res/knuth-morris-pratt-string-matching/kmp-string-matcher.js :

// Ищет заданную строку шаблона в заданной текстовой строке, используя алгоритм сопоставления строк Кнута-Морриса-Пратта.
// Если шаблон найден, возвращается индекс начала самого раннего совпадения в 'тексте'. В противном случае возвращается -1.
function kmpSearch(pattern, text) {
  if (pattern.length == 0)
    return 0; // Немедленное совпадение

  // Вычислить самую длинную таблицу суффиксов-префиксов
  var lsp = [0]; // Базовый вариант
  for (var i = 1; i < pattern.length; i++) {
    var j = lsp[i - 1]; // Начнем с предположения, что мы расширяем предыдущий LSP
    while (j > 0 && pattern.charAt(i) != pattern.charAt(j))
      j = lsp[j - 1];
    if (pattern.charAt(i) == pattern.charAt(j))
      j++;
    lsp.push(j);
  }

  // Пройдемся по текстовой строке
  var j = 0; // Количество символов в шаблоне
  for (var i = 0; i < text.length; i++) {
    while (j > 0 && text.charAt(i) != pattern.charAt(j))
      j = lsp[j - 1]; // Возвращаемся к шаблону
    if (text.charAt(i) == pattern.charAt(j)) {
      j++; // Соответствующий следующий символ, позиция приращения
      if (j == pattern.length)
        return i - (j - 1);
    }
  }
  return -1; // Не найден
}

console.log(kmpSearch('ays', 'haystack') != -1) // истинный
console.log(kmpSearch('asdf', 'haystack') != -1) // ложный