通常我会期望一个 String.contains() 方法,但似乎没有一个。

这是什么合理的方式来检查这一点?


当前回答

ECMAScript 6 引入 String.prototype. 包含:

const string = “foo”; const substring = “oo”; console.log(string.includes(substring)); // true

String.prototype.includes 是案例敏感的,并且不受 Internet Explorer 支持。

在 ECMAScript 5 或更古老的环境中,使用 String.prototype.indexOf,当无法找到基础时返回 -1:

var string = “foo”; var substring = “oo”; console.log(string.indexOf(substring)!== -1); // true

其他回答

另一个替代方案是KMP(Knuth-Morris-Pratt)。

KMP 算法在最糟糕的情况下 O(n+m)时间中寻找长度-m 序列,与天真算法中最糟糕的情况 O(n⋅m)相比,因此使用 KMP 可能合理,如果你关心最糟糕的情况时间复杂性。

// 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.

函数 kmpSearch(模式,文本) {如果(模式.长度 == 0)返回 0; // 即时匹配 // 计算最长的 suffix 预定表 var lsp = [0]; // 基案例为(var i = 1; i < 模式.长度; i++) { var j = lsp[i - 1]; // 开始假设我们正在扩展之前的 LSP 同时(j > 0 && 模式[i]!== 模式[j] j = lsp[j - 1]; 如果(模式[i] === 模式[j])

有一个 String.prototype. 包含在 ES6:

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

请注意,在 Internet Explorer 或其他旧浏览器中,没有或不完整的 ES6 支持,以便在旧浏览器中运行,您可能希望使用像 Babel 这样的转换器,像 es6-shim 这样的图书馆,或来自 MDN 的此多片:

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

ECMAScript 6 引入 String.prototype. 包含:

const string = “foo”; const substring = “oo”; console.log(string.includes(substring)); // true

String.prototype.includes 是案例敏感的,并且不受 Internet Explorer 支持。

在 ECMAScript 5 或更古老的环境中,使用 String.prototype.indexOf,当无法找到基础时返回 -1:

var string = “foo”; var substring = “oo”; console.log(string.indexOf(substring)!== -1); // true