🎯 在 JavaScript 中使用正则表达式
我们都同意,正则表达式很难。但与此同时,它的使用也是不可避免的。正则表达式的核心目的是匹配模式。我们不需要每次匹配模式时都输入相同的信息。
🤔 例如,有时我们只需要知道它是否存在—— atrue
或false
,有时我们需要index
,等等。这就是为什么 JavaScript 中存在不同的方法可以与正则表达式配合使用并获取特定信息。
本文主要介绍这些用例以及正确的使用方法。
对于初学者来说,这可能会令人困惑。请尽量消化一下,需要的时候可以随时回来阅读这篇文章。一篇文章很难涵盖所有概念。欢迎在下方评论区提问或讨论。
1️⃣ 仅获取第一次出现的索引
String.prototype.search()
在这种情况下才是正确的做法。
🚨记住
- 如果未找到则返回 -1。
- -1 与 不同
false
。请勿在if
块中使用它。 - 无论正则表达式上的全局标志如何
g
,它都会给出相同的结果。
2️⃣ 获取 A True/False
— 存在与否
RegExp.prototype.test()
true/false
根据是否找到模式返回。
🚨记住
- 返回类型是bool。
- 结果可直接在
if
块内使用。 - 当使用全局标志时
g
,它可以为下一次出现执行多次。即,true
只要它不断找到模式的下一次出现,它就会不断返回。
🚩 全局标志说明
你注意到正则表达式了吗/foo/g
?它的意思是:
- 逐字匹配
foo
。 - 'g' 表示第一次匹配后不返回。查找所有匹配项。
在代码中,它返回了true
两次。第一次,它foo
在 中找到football
;第二次,在 中找到foosball
。第三次,它返回 false,并且会一直返回 false。
RegExp.prototype.test()
通过维护名为的属性来实现这一点lastIndex
。- 每次运行时它都会更新。
- 当返回所有出现的情况时,它被设置为
0
。 lastIndex
通常 是 最后 一次index of occurrence + 1
.
让我们重新审视一下上面的代码lastIndex
。
2️⃣ 仅获取所有匹配的模式
String.prototype.match()
为您提供正则表达式指定的模式的所有匹配/出现的数组。
🚨记住
g
仅当指定全局标志时,您才会在响应中获得一个数组。- 如果正则表达式中未指定全局标志
g
,则结果会有所不同。我们将在本文后面介绍。
3️⃣ 获取唯一第一个匹配的模式和起始索引
String.prototype.match()
还可以为您提供唯一的第一个匹配模式及其出现的起始索引。
🚨记住
g
仅当正则表达式中未指定全局标志时,您才会获得这些详细信息。- 返回一个对象,其中包含匹配模式、索引和输入字符串等信息。
- 它对于标记化非常有帮助。
请注意,您也可以将
RegExp.prototype.exec()
其用于此目的。下文将对此进行解释。
4️⃣ 获取所有匹配的模式及其起始索引
在这种情况下,您有两种选择:
RegExp.prototype.exec()
String.prototype.matchAll()
两者解释如下:
RegExp.prototype.exec()
g
如果您打算以这种方式使用,请不要忘记设置全局标志。如果省略,它的行为将与 相同,并且每次String.prototype.match()
都会给出相同的结果和(0)。lastIndex
🚨记住
- 您必须每次都执行它才能获得下一次发生的详细信息。
- 与 类似
RegExp.prototype.test()
,它也是有状态的。 lastIndex
每次运行时它都会更新。- 完成后,
lastIndex
设置为 0,结果为null
。
如果您使用
while
类似本例的循环,请不要忘记g
标志。
String.prototype.matchAll()
我们使用 获得的结果RegExp.prototype.exec()
也可以使用 获得,但使用循环String.prototype.matchAll()
更方便。for-of
🚨记住
- 如果你的正则表达式中没有全局标志,它就不起作用
g
。 Iterable
执行此命令时,您会得到一个。- 这个想法是,你编写一个简单的
for-of
循环,它会处理剩下的事情。
如果您熟悉 JavaScript 中的生成器和迭代器,您也可以获取迭代器并
.next()
根据您的用例使用。
.next()
返回一个具有value
和done
属性的对象。done
直到遍历完整个列表,属性才会返回 false。
🙌 总结
这就是我在 JavaScript 中使用正则表达式时所考虑的全部内容——一些用例以及应该使用的方法。下次你在 JavaScript 中使用正则表达式时,这些内容可能会有所帮助。
不过,我非常想知道你是如何在 JavaScript 中处理正则表达式的?欢迎在下面的评论区分享你的用例/方法。
有了 Daily,开发者可以专注于代码,无需搜索新闻。只需打开新标签页,即可立即访问所有这些文章及更多内容。
鏂囩珷鏉ユ簮锛�https://dev.to/dailydotdev/using-regular-expressions-in-javascript-4452