如何在JavaScript中检查字符串是否包含子字符串?

在JavaScript中检查一个字符串是否包含某个子字符串是一个常见任务。本文将介绍几种实现该功能的方法,包括传统方法和高级算法。

使用 indexOf() 方法

最基础和常见的方法是使用 indexOf() 方法。该方法返回字符串在另一个字符串中的起始位置,如果未找到则返回 -1

let mainString = "hello world";
let subString = "world";if(mainString.indexOf(subString) !== -1) {console.log("包含子字符串");
} else {console.log("不包含子字符串");
}

使用 includes() 方法

ES6引入了 includes() 方法,不仅语法简洁,而且可读性更好。该方法返回一个布尔值,表明是否找到了某个子字符串:

let mainString = "hello world";
let subString = "world";if(mainString.includes(subString)) {console.log("包含子字符串");
} else {console.log("不包含子字符串");
}

使用正则表达式

正则表达式是一种强大的工具,可以用来搜索复杂的模式。你可以使用 RegExp 类来创建正则表达式对象,并调用 test() 方法来检查字符串是否包含子字符串:

let mainString = "hello world";
let subString = "world";let regex = new RegExp(subString);
if(regex.test(mainString)) {console.log("包含子字符串");
} else {console.log("不包含子字符串");
}

使用 Knuth-Morris-Pratt (KMP) 算法

对于更复杂和性能敏感的需求,可以使用KMP算法。KMP算法的最坏情况下时间复杂度为 O(n+m),相比于简单搜索的 O(n*m) 更高效。以下是KMP算法在JavaScript中的实现:

// 使用KMP算法在文本中搜索模式字符串
// 如果找到模式,返回文本中匹配开始的索引;否则返回-1
function kmpSearch(pattern, text) {if (pattern.length === 0) return 0; // 立即匹配// 计算最长公共前后缀数组let lsp = [0]; // 基础情况for (let i = 1; i < pattern.length; i++) {let j = lsp[i - 1]; // 记录上一个位置的LSPwhile (j > 0 && pattern[i] !== pattern[j])j = lsp[j - 1];if (pattern[i] === pattern[j])j++;lsp.push(j);}// 遍历文本字符串let j = 0; // 在模式字符串中匹配的字符数量for (let i = 0; i < text.length; i++) {while (j > 0 && text[i] !== pattern[j])j = lsp[j - 1]; // 模式字符串回退if (text[i] === pattern[j]) {j++; // 下一个字符匹配,增加位置if (j === pattern.length)return i - (j - 1);}}return -1; // 未找到
}console.log(kmpSearch('ays', 'haystack') !== -1); // true
console.log(kmpSearch('asdf', 'haystack') !== -1); // false

总结

本文介绍了四种在JavaScript中检查字符串是否包含子字符串的方法:使用 indexOf()includes()、 正则表达式和KMP算法。每种方法都有其适用场景,从基本的实现到复杂的算法,你可以根据具体需求选择合适的方法。希望本文对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TPshop商城的保姆教程(windows)

提前准备 phpStudy下载&#xff1a;https://www.xp.cn/download.html 选择适合自己的版本下载 TPshop商城源文件下载链接&#xff1a; https://pan.baidu.com/s/143fLrxbwe9CTMCbyx7mXJQ?pwd6666 开始安装 安装完phpstudy后 以管理员的身份启动phpstudy.exe 选择合适自己…

2024年03月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 以下选项中,创建类正确的是?() A: class test1: def prt(self): …… B: class Mg(): def__init__(na,ag): self.na=na C: class A(): def print(self): print(“Yes”) a=A() a.print() D…

【好书推荐,持续更新~~】

书籍推荐&#xff0c;持续更新~~ 1.《只是为了好玩: Linux之父林纳斯自传》-- Linus Torvalds, David Diamond Linux之父Linus Torvalds的自传&#xff0c;也是Linus唯一一本书。Linus以调侃的语气讲述了自己的成长经历&#xff0c;在他看来&#xff0c;一切都是为了好玩儿&am…

【Vue】v-bind属性绑定指令

作用&#xff1a;动态设置html的标签属性 比如&#xff1a;src、url、title 默认情况下是单向的 语法&#xff1a; v-bind:属性名"表达式"v-bind:可以简写成 > : 比如&#xff0c;有一个图片&#xff0c;它的 src 属性值&#xff0c;是一个图片地址。这个地址…

Android SDK下载安装(_指定版本)

安装完sdk&#xff0c;就可以直接使用adb命令了&#xff0c;如果想做app相关自动化测试&#xff0c;也是需要sdk环境依赖的 一、SDK下载 A&#xff1a;官网下载&#xff1a; 管内镜像网站(推荐)&#xff1a;https://www.androiddevtools.cn/index.html 官网&#xff1a;htt…

2024-5-9——给植物浇水 II

2024-5-9 题目来源我的题解方法一 双指针 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2105 我的题解 方法一 双指针 使用两个指针t1和t2记录Alice和Bob当前还未浇水的植物&#xff0c;使用变个变量cap1和cap2表示Alice和Bob当前剩余的水量。 两端同时浇水&#xff0…

渗透测试一些知识点

1、如果提示缺少参数&#xff0c;如{msg&#xff1a;params error}&#xff0c;可尝使用字典模糊测试构造参数&#xff0c;进一步攻击。 2、程序溢出&#xff0c;int最大值为2147483647&#xff0c;可尝试使用该值进行整数溢出&#xff0c;观察现象。 3、403&#xff0c;404响…

如何使用MATLAB写测试(2)Negative Test

如何使用MATLAB写测试&#xff08;2&#xff09;Negative Test 原文&#xff1a;如何使用MATLAB写测试&#xff08;2&#xff09;Negative Test - 知乎 (zhihu.com) 上一篇请参见 如何使用MATLAB写测试&#xff08;1&#xff09; - 知乎专栏 上一篇中&#xff0c;我们的实习…

【YashanDB知识库】ODBC驱动类问题定位方法

【标题】ODBC驱动类问题定位方法 【需求分类】故障分析 【关键字】ODBC 【需求描述】由于我们的ODBC接口目前尚不完善&#xff0c;经常会遇见ODBC接口能力不足导致应用功能无法运行的问题&#xff0c;需要定位手段确定底层是哪个接口报错 【需求原因分析】方便一线数据库管…

【python】修改目标检测的txt标签(yolo)的类别ID映射

脚本功能&#xff1a; 针对目录下的所有yolo格式的txt标签文件&#xff0c;将class类别的id修改为指定id。 实际应用常见不多 代码 # -*- coding: utf-8 -*- # Time : 2023/9/11 10:58 # Author : CLW # FileName: change_txt_label.py # Software: PyCharmimport os 算法功…

markdown语法保存

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

实验七 RTP、DSPP协议的配置

一、实验目的 掌握 RIP 动态路由协议的配置、诊断方法。 二、实验步骤 1、 运行 Cisco Packet Tracer 软件&#xff0c;在逻辑工作区放入两台路由器、两台工作站 PC&#xff0c;分别点击各路由器&#xff0c;打开其配置窗口&#xff0c;关闭电源&#xff0c;分别加入一个 2 …

PowerPivot-跨表取值

在PowerPivot中&#xff0c;跨表取值通常涉及创建关系和使用DAX&#xff08;数据分析表达式&#xff09;函数。 以下是一些基本步骤和常用的DAX函数&#xff0c;帮助你在PowerPivot中实现跨表取值&#xff1a; 步骤1&#xff1a;创建关系 加载数据&#xff1a;确保你已将需要…

运维笔记:流编辑器sed命令用法解析

运维笔记 sed命令用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/arti…

数据结构与算法-有效的括号

数据结构与算法-有效的括号 大家好&#xff0c;欢迎来到我们的算法学习系列。今天是我们的第一篇文章&#xff0c;我们将探讨一个经典的面试题目——有效的括号匹配问题。 什么是有效的括号匹配&#xff1f; 在许多编程语言中&#xff0c;括号用于定义代码块、函数参数等。确…

Matlab 结构光相移法(单频多相)

文章目录 一、简介1、基于点的测距2、基于条纹的测距二、条纹编码2.1 二进制编码2.2相移法三、实现代码参考文献一、简介 在介绍相移法之前,我们需要先了解一下为啥会有相移法,了解了其来龙去脉,则更容易去应用它。 1、基于点的测距 首先我们从点的测距开始,这有点类似于立…

每日一题《leetcode--117.填充每个结点的下一个右侧结点指针||》

https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/ 这道题与我之前发布的题目116是一样的解题过程&#xff0c;只是本题所给的数组大小与116不同&#xff0c;这是需要注意的。 116题目链接&#xff1a; http://t.csdnimg.cn/3Ub02 struct Node* c…

推导n维镜像变换公式(householder transform)

n维镜像变换公式&#xff0c;就是将空间某个点 X 0 X_0 X0​&#xff0c;以某个平面对对称平面&#xff0c;平面法向量维 v v v&#xff0c;该平面过空间原点。计算 X 0 X_0 X0​的镜像。假设镜像为 X 1 X_1 X1​。 镜像需要满足下面两个条件 &#xff08;1&#xff09; X 0 X…

RAID配置实战

概念 raid磁盘阵列&#xff1a;可以用不同的硬盘分区&#xff0c;组成一个逻辑上的硬盘。具有高可用 raid级别&#xff1a; raid0 &#xff1a;条带化存储&#xff1a;数据分散在多个物理硬盘上的存储方式。利用多个磁盘并行读取和写入。存储性能和读写性能是最好的。没有冗…

解读《互联网政务应用安全管理规定》网络和数据安全中的身份认证和审计合规建设

为保障互联网政务应用安全&#xff0c;由中央网络安全和信息化委员会办公室、中央机构编制委员会办公室、工业和信息化部、公安部制定的《互联网政务应用安全管理规定》近日印发&#xff0c;自2024年7月1日起施行。 规定共8章&#xff0c;包括总则、开办和建设、信息安全、网络…