🎯 在 JavaScript 中使用正则表达式

2025-06-08

🎯 在 JavaScript 中使用正则表达式

我们都同意,正则表达式很难。但与此同时,它的使用也是不可避免的。正则表达式的核心目的是匹配模式。我们不需要每次匹配模式时都输入相同的信息。

🤔 例如,有时我们只需要知道它是否存在—— atruefalse,有时我们需要index,等等。这就是为什么 JavaScript 中存在不同的方法可以与正则表达式配合使用并获取特定信息。

本文主要介绍这些用例以及正确的使用方法。

对于初学者来说,这可能会令人困惑。请尽量消化一下,需要的时候可以随时回来阅读这篇文章。一篇文章很难涵盖所有概念。欢迎在下方评论区提问或讨论。

1️⃣ 仅获取第一次出现的索引

String.prototype.search()在这种情况下才是正确的做法。

🚨记住

  • 如果未找到则返回 -1。
  • -1 与 不同false。请勿在if块中使用它。
  • 无论正则表达式上的全局标志如何g,它都会给出相同的结果。

String.search 使用示例

2️⃣ 获取 A True/False— 存在与否

RegExp.prototype.test()true/false根据是否找到模式返回。

🚨记住

  • 返回类型是bool。
  • 结果可直接在if块内使用。
  • 当使用全局标志时g,它可以为下一次出现执行多次。即,true只要它不断找到模式的下一次出现,它就会不断返回。

regexp.test 使用示例

🚩 全局标志说明

你注意到正则表达式了吗/foo/g?它的意思是:

  1. 逐字匹配foo
  2. 'g' 表示第一次匹配后不返回。查找所有匹配项。

在代码中,它返回了true两次。第一次,它foo在 中找到football;第二次,在 中找到foosball。第三次,它返回 false,并且会一直返回 false。

  • RegExp.prototype.test()通过维护名为的属性来实现这一点lastIndex
  • 每次运行时它都会更新。
  • 当返回所有出现的情况时,它被设置为0
  • lastIndex通常 是 最后 一次index of occurrence + 1.

让我们重新审视一下上面的代码lastIndex

全球旗帜解释

2️⃣ 仅获取所有匹配的模式

String.prototype.match()为您提供正则表达式指定的模式的所有匹配/出现的数组。

🚨记住

  • g仅当指定全局标志时,您才会在响应中获得一个数组。
  • 如果正则表达式中未指定全局标志g,则结果会有所不同。我们将在本文后面介绍。

String.match() 使用示例

3️⃣ 获取唯一第一个匹配的模式和起始索引

String.prototype.match()还可以为您提供唯一的第一个匹配模式及其出现的起始索引。

🚨记住

  • g仅当正则表达式中未指定全局标志时,您才会获得这些详细信息。
  • 返回一个对象,其中包含匹配模式、索引和输入字符串等信息。
  • 它对于标记化非常有帮助。

Stirng.match 仅出现一次

请注意,您也可以将RegExp.prototype.exec()其用于此目的。下文将对此进行解释。

4️⃣ 获取所有匹配的模式及其起始索引

在这种情况下,您有两种选择:

  1. RegExp.prototype.exec()
  2. String.prototype.matchAll()

两者解释如下:

RegExp.prototype.exec()

g如果您打算以这种方式使用,请不要忘记设置全局标志。如果省略,它的行为将与 相同,并且每次String.prototype.match()都会给出相同的结果和(0)。lastIndex

🚨记住

  • 您必须每次都执行它才能获得下一次发生的详细信息。
  • 与 类似RegExp.prototype.test(),它也是有状态的。
  • lastIndex每次运行时它都会更新。
  • 完成后,lastIndex设置为 0,结果为null

RegExp.exec 使用示例

如果您使用while类似本例的循环,请不要忘记g标志。

String.prototype.matchAll()

我们使用 获得的结果RegExp.prototype.exec()也可以使用 获得,但使用循环String.prototype.matchAll()更方便。for-of

🚨记住

  • 如果你的正则表达式中没有全局标志,它就不起作用g
  • Iterable执行此命令时,您会得到一个。
  • 这个想法是,你编写一个简单的for-of循环,它会处理剩下的事情。

String.matchAll 用法

如果您熟悉 JavaScript 中的生成器和迭代器,您也可以获取迭代器并.next()根据您的用例使用。

.next()返回一个具有valuedone属性的对象。done直到遍历完整个列表,属性才会返回 false。

String.matchAll 作为迭代器

🙌 总结

这就是我在 JavaScript 中使用正则表达式时所考虑的全部内容——一些用例以及应该使用的方法。下次你在 JavaScript 中使用正则表达式时,这些内容可能会有所帮助。

不过,我非常想知道你是如何在 JavaScript 中处理正则表达式的?欢迎在下面的评论区分享你的用例/方法。


👋 在Twitter 上关注我们,了解最新动态!

有了 Daily,开发者可以专注于代码,无需搜索新闻。只需打开新标签页,即可立即访问所有这些文章及更多内容。

每日海报

鏂囩珷鏉ユ簮锛�https://dev.to/dailydotdev/using-regular-expressions-in-javascript-4452
PREV
Vue 3 即将到来——期待什么以及如何准备
NEXT
语义 HTML 及其重要性