我正在写一个正则表达式来捕获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吗?
2条答案
按热度按时间cqoc49vn1#
以下是对正则表达式所做的一些修正,以使其按预期工作。
(?:[^:@]*)
可以简化为[^:@]*
。如果不将其作为一个组来处理,则不需要将其放在方括号中,然后使用?:
将其设为非组。还在其中添加了\s
,这样它就不会抓取任何换行符(?::[^@]*)?
更改为(?::[^@\s]*)?
,以包括\s
@{0,1}
更改为@
。此外,您可以将@{0,1}
简单地写成@?
[^\/\?]+
更改为[^\/\?\s]+
,以再次包含\s
通过上述更改,它似乎像您预期的那样工作。
Updated Regex Demo
让我知道如果这对你有用。
pbossiut2#
另一种解决方案(regex101):
字符串