PostgreSQL连接字符串的正则表达式

2hh7jdfx  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(117)

我正在写一个正则表达式来捕获PostgreSQL的连接字符串。连接字符串的格式为:

(postgresql|postgres)://[userspec@][hostspec][/dbname][?paramspec]

where userspec is: user[:password]
and hostspec is: [host][:port][,...]
and paramspec is: name=value[&...]

字符串
在这里,用户规范端口数据库名参数规范是可选的。
连接字符串的示例如下:

postgresql://localhost
postgresql://localhost:5433
postgresql://localhost/mydb
postgresql://user@localhost
postgresql://user:secret@localhost
postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp
postgresql://host1:123,host2:456/somedb?application_name=myapp
postgres://myuser:mypassword@192.168.0.100:5432/mydatabase
postgresql://192.168.0.100/mydb


我尝试用下面的正则表达式来捕获连接字符串,并在捕获组中捕获主机规范。

(postgresql|postgres):\/\/((?:[^:@]*)(?::[^@]*)?@{0,1})?(?<server>[^\/\?]+)\b


但是,当用户规范不存在时,正则表达式无法正确捕获。正则表达式可以在here中找到。
您能指出如何避免对userspec进行贪婪的求值并在每行中找到hostspec吗?

cqoc49vn

cqoc49vn1#

以下是对正则表达式所做的一些修正,以使其按预期工作。

  • (?:[^:@]*)可以简化为[^:@]*。如果不将其作为一个组来处理,则不需要将其放在方括号中,然后使用?:将其设为非组。还在其中添加了\s,这样它就不会抓取任何换行符
  • 由于上述原因,将(?::[^@]*)?更改为(?::[^@\s]*)?,以包括\s
  • 根据需要将@{0,1}更改为@。此外,您可以将@{0,1}简单地写成@?
  • 服务器组中的最后一个[^\/\?]+更改为[^\/\?\s]+,以再次包含\s

通过上述更改,它似乎像您预期的那样工作。
Updated Regex Demo
让我知道如果这对你有用。

pbossiut

pbossiut2#

另一种解决方案(regex101):

(postgres(?:ql)?):\/\/(?:([^@\s]+)@)?([^\/\s]+)(?:\/(\w+))?(?:\?(.+))?

字符串

相关问题