7407

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

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

0

3个答案

重置为默认值
15909

引入ECMAScript 6字符串.原型.包括:

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

字符串.原型.包括区分大小写受Internet Explorer支持没有聚乙烯填料.

在ECMAScript 5或更早的环境中,使用字符串.原型.indexOf,当找不到子字符串时返回-1:

var字符串=“foo”;var substring=“oo”;console.log(string.indexOf(子字符串)!==-1); // 真的

12
  • 58
    虽然这是一个很好的答案,而且OP从未要求进行“案例敏感”搜索,但应该注意到包括执行区分大小写搜索。
    – 加文
    评论 2021年6月18日15:22
  • 9
    @Aashiq:是的,空字符串是每个字符串的子字符串。
    – 莱伊-
    评论 2021年9月22日15:39
  • 12
    @默认情况下,如果我想知道某个东西是否是子字符串,我想它是区分大小写的。毕竟,“A”和“A”是不同的字符。OP从未请求“区分大小写”搜索(如果您将所有内容都设为小写,那么这是一个简单的解决方案)
    – 达沃
    评论 2022年1月15日1:31
  • 2
    索引属于也是区分大小写的搜索,因此包括索引属于是区分大小写的。 评论 2022年4月13日0:21
  • 15
    为什么这里还要讨论区分大小写? 评论 2022年6月30日19:04
794

有一个字符串.原型.包括在ES6中:

“土豆”。包括(“to”);>真的

请注意无法在Internet Explorer或其他一些旧浏览器中工作没有或不完全支持ES6。为了使其在旧浏览器中工作,您可能希望使用类似于巴别塔,类似于垫片库es6垫片,或者这个来自MDN的polyfill:

if(!String.prototype.includes){String.prototype.includes=函数(搜索、启动){'使用严格';if(开始类型!=='number'){开始=0;}if(start+search.length>this.length){返回false;}其他{return this.indexOf(搜索,开始)!==-1;}};}
2
  • 1
    只是好奇,为什么你需要检查长度?IE在这种情况下会失败吗? 评论 2021年2月2日15:29
  • 2
    还有检查表现不佳包括。示例:es6 includes为返回false“abc”.包括(“ab”,“1”)此polyfill将返回true 评论 2021年2月2日15:34
108

另一种选择是KMP公司(Knuth–Morris–Pratt)。

KMP算法搜索长度-长度中的子串-n个最坏情况O中的字符串(n个+)时间,与O的最坏情况相比(n个)对于朴素算法,如果您关心最坏情况下的时间复杂性,那么使用KMP可能是合理的。

下面是Nayuki项目的JavaScript实现,摘自https://www.nayuki.io/res/knuth-morris-pratt-sting-matching/kmp-string-matcher.js:

//使用Knuth-Morris-Pratt字符串匹配算法在给定文本字符串中搜索给定模式字符串。//如果找到模式,则返回“text”中最早匹配的开始的索引。否则返回-1。

功能kmpSearch(模式、文本){if(pattern.length==0)返回0;//即时匹配//计算最长后缀前缀表var lsp=[0];//基本情况for(var i=1;i<模式长度;i++){var j=lsp[i-1];//首先假设我们正在扩展以前的LSPwhile(j>0&&模式[i]!==模式[j])j=lsp[j-1];if(模式[i]===模式[j])j++;lsp.推动(j);}//遍历文本字符串变量j=0;//模式中匹配的字符数for(变量i=0;i<文本长度;i++){while(j>0&&text[i]!=模式[j])j=lsp[j-1];//回到模式中if(文本[i]==图案[j]){j++;//匹配的下一个字符,递增位置如果(j==图案长度)返回i-(j-1);}}返回-1;//找不到}console.log(kmpSearch('ays','haystack')!=-1) //真console.log(kmpSearch('asdf','haystack')!=-1) //错误

6
  • 11
    对这种方法没有任何疑问。。。但为什么在有包括索引属于在桌子上。(尽管那些可能使用KMP的人的底层含义……不确定) 评论 2021年7月13日17:00
  • 2
    KMP在此提供线性O(n)性能。
    – wz366型
    评论 2021年7月15日17:20
  • 1
    @wz366 KMP提供O(n),其余的呢?有主意吗? 评论 2021年7月18日8:12
  • 如果将其用于速度,则更换后可能会更快.charAt(i)具有[i]以避免额外的函数调用。
    – 丹达维
    评论 2021年8月20日2:54
  • 5
    99%的情况下,这样做是过分的,对软件项目的非计算方面有害。除非你正在做一些非常关键的事情,否则我强烈建议不要走这条路。。。我不认为像推特、脸书或大多数谷歌产品这样的大玩家会使用这个。。。那你为什么要这么做? 评论 2023年1月11日19:16

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.