includes()用于判断是否包含固定子串,语义清晰、性能好;正则匹配(如test())用于复杂模式校验,支持大小写忽略、边界控制等高级功能。
字符串的 includes() 方法和正则匹配(如 test() 或 match())都能判断子串是否存在,但它们解决的问题不同:前者只关心“是否包含固定文本”,后者能处理“是否符合某种模式”。选哪个取决于你到底想匹配什么。
includes() 是最直接的子串查找方式,底层用的是朴素字符串匹配(类似 indexOf),不支持通配、大小写忽略或边界控制。它适合快速判断一个明确的字符串是否出现。
"Hello".includes("hello") 返回 false
"abc123".includes("ad+") 就是在找字面量 "ad+",不是数字模式正则表达式通过 RegExp.prototype.test() 或字符串的 match() 等方法,可以描述复杂规则——比如“以字母开头、后跟至少一位数字”、“邮箱格式”、“单词边界内的某个词”。这是 includes() 完全做不到的。
/abc/i.test("ABC") 可忽略大小写;/word/g 能精确匹配整个单词new RegExp(pattern, flags) 允许运行时拼接规则.、*、+)需双反斜杠转义,而 includes() 中只需单反斜杠(如果用于字符串字面量)很多人用正则去干 includes() 的活,比如 /search/.test(str),虽然可行,但没必要——除非你需要额外能力(如忽略大小写、全局搜索、捕获分组)。反过来,试图用 includes() 实现模糊匹配(如“包含数字”或“以某前缀开头且后跟下划线”)会失败。
includes(),语义清晰、性能好includes() 不行,改用 toLowerCase().includes() 或正则 /xxx/i
/word/,includes("word") 会把 "keyword" 也误判为匹配includes() 没有返回位置、分组或捕获能力在多数业务代码中,可读性比微秒级性能更重要。如果逻辑只是“这个按钮文案里有没有‘删除’二字”,btnText.includes("删除") 一眼就懂;写成 /删除/.test(btnText) 虽然等价,但引入了不必要的正则心智负担。只有当需求超出字面匹配时,才自然升级到正则。
立即学习“Java免费学习笔记(深入)”;
不复杂但容易忽略:先想清楚你要匹配的是“一段确定的字符”,还是“一类符合规则的字符串”——答案决定了该用哪个工具。