首页 > 解决方案 > 从数据库 url 字符串中提取数据库凭据的正则表达式的效率

问题描述

假设我有一个如下所示的 db url 字符串:

"mysql2://foo:bar@baz.com/fizz?reconnect=true"

我想出了一个用于提取用户名、密码和主机名的正则表达式:

/\w:\/\/(\w+):/ # extracts username ("foo")
/\w:\/\/\w+:(\w+)/ # extracts password ("bar")
/\w:\/\/\w+:\w+@([\w+-\/]+)/ # extracts host name ("baz.com")

如何改进/提高这个正则表达式的效率?

标签: regex

解决方案


这是一个正则表达式,将您的 3 组合成一个具有 3 个不同捕获组的正则表达式:

\w:\/{2}(\w+):(\w+)@(\w+\.\w+)

一开始它们似乎是非常简单和快速的正则表达式,但这里有一个测试正则表达式的好工具:https ://regex101.com/ 。它会根据您的样本和捕获组向您显示运行所需的步骤。对我来说,这是我在处理不简单的新正则表达式时首先使用的工具之一。

至于改进正则表达式,您想尝试使引擎执行尽可能少的步骤。因此,正则表达式中的快速匹配和快速失败将有所帮助。例如,如果它始终是 mysql2,您可以2:\/{2}改为使用 regex 启动,这会根据我上面的 regex 减少 10 个步骤。


推荐阅读