Bir dizenin JavaScript'te alt dize içerip içermediğini nasıl kontrol edebilirim?


7427

Genellikle bir String.contains()yöntem beklerdim , ama bir yöntem yok gibi görünüyor.

Bunu kontrol etmenin makul bir yolu nedir?

Yanıtlar:


13773

ECMAScript 6 tanıtıldı String.prototype.includes:

const string = "foo";
const substring = "oo";

console.log(string.includes(substring));

includes Yine de Internet Explorer desteği yok . ECMAScript 5 veya daha eski ortamlarda, String.prototype.indexOfbir alt dize bulunamadığında -1 döndüren şunu kullanın :

var string = "foo";
var substring = "oo";

console.log(string.indexOf(substring) !== -1);


25
IE'yi de sevmiyorum, ancak büyük ölçüde özdeş olan iki işleviniz varsa ve biri diğerinden daha iyi destekleniyorsa, daha iyi destekleneni seçmelisiniz? Yani indexOf()...
rob74

3
Büyük / küçük harfe duyarlı olmayan bir arama yapmak mümkün müdür?
Eric McWinNEr

18
string.toUpperCase().includes(substring.toUpperCase())
Rodrigo Pinto

2
@EricMcWinNEr /regexpattern/i.test(str)-> i bayrağı büyük / küçük harfe duyarsızlık anlamına gelir
Code Maniac

Bu, Google App Script'te benim için işe yaramıyor gibi görünüyor.
Ryan

559

Bir yoktur String.prototype.includesES6 içinde :

"potato".includes("to");
> true

Bunun Internet Explorer'da veya ES6 desteği olmayan veya eksik olan bazı eski tarayıcılarda çalışmadığını unutmayın. Eski tarayıcılarda çalışır hale getirmek için, böyle bir transpiler kullanmak isteyebilir Babel gibi bir dolgu kütüphaneye ES6-şim veya bu MDN Polyfill :

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;
    }
  };
}

3
Sadece bunu yap "potato".includes("to");ve Babil'den geç.
Derk Jan Speelman

1
içerir ne yazık ki IE tarafından desteklenmiyor
Sweet Chilly Philly

@eliocs buna cevap verebilir misiniz? Herhangi bir mesaj alıyorum. İletiyi değiştirmeniz gerekiyor stackoverflow.com/questions/61273744/…
sejn

1
bunun için başka bir artı da büyük / küçük harfe duyarlı olmasıdır. "boot".includes("T")olduğunufalse
Jonatas CD

47

Başka bir alternatif KMP'dir (Knuth – Morris – Pratt).

KMP algoritması , saf algoritma için en kötü O ( nm ) ile karşılaştırıldığında, en kötü O ( n + m ) süresinde bir uzunluk n dizesinde uzunluk- m bir alt dizeyi arar , bu nedenle KMP kullanımı En kötü zaman karmaşıklığını önemsiyorsanız makul olun.

İşte Project Nayuki tarafından https://www.nayuki.io/res/knuth-morris-pratt-string-matching/kmp-string-matcher.js adresinden alınan bir JavaScript uygulaması :

// Searches for the given pattern string in the given text string using the Knuth-Morris-Pratt string matching algorithm.
// If the pattern is found, this returns the index of the start of the earliest match in 'text'. Otherwise -1 is returned.

function kmpSearch(pattern, text) {
  if (pattern.length == 0)
    return 0; // Immediate match

  // Compute longest suffix-prefix table
  var lsp = [0]; // Base case
  for (var i = 1; i < pattern.length; i++) {
    var j = lsp[i - 1]; // Start by assuming we're extending the previous 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);
  }

  // Walk through text string
  var j = 0; // Number of chars matched in pattern
  for (var i = 0; i < text.length; i++) {
    while (j > 0 && text.charAt(i) != pattern.charAt(j))
      j = lsp[j - 1]; // Fall back in the pattern
    if (text.charAt(i) == pattern.charAt(j)) {
      j++; // Next char matched, increment position
      if (j == pattern.length)
        return i - (j - 1);
    }
  }
  return -1; // Not found
}

console.log(kmpSearch('ays', 'haystack') != -1) // true
console.log(kmpSearch('asdf', 'haystack') != -1) // false


11
Bu
abartılı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.