postgres 与正则表达式匹配

Posted

技术标签:

【中文标题】postgres 与正则表达式匹配【英文标题】:postgres match with regex 【发布时间】:2022-01-22 16:20:14 【问题描述】:

我有一列包含这样的值

views.decorators.cache.cache_header.APISetOne.596e986edcf211a323dbac38fe3654b8.en-us.UTC
views.decorators.cache.cache_page.APISetTwo.GET.1fc365e1f67d39935b199c133fada23b.ce596bddd33104b703521c71eb2e32c6.en-us.UTC

类似于 'view.decorators.cache.cache_page|header.if header then None in this part, if not 'GET'.key_prefix_name.some_hash_that changes_everytime.last_hash.en-us.UTC' #我不关心 en-us.UTC 的事情。

我可以访问 key_prefix_name 和 last_hash。

我想搜索包含特定 key_prefix_name 和 last_hash 的行。

我正在努力创建一个与之匹配的正则表达式。到目前为止,我想出了类似的东西:

select col1 from my_table where col1 ~* 'views.decorators.cache.cache_page.**APISetOne**.GET.[a-z,1-0].**ce596bddd33104b703521c71eb2e32c6**.en-us.UTC';

【问题讨论】:

类似views\.decorators\.cache\.cache_(?:page\.APISetOne\.GET|header)\.([[:alnum:]]+)\.([[:alnum:]]+)\.en-us\.UTC?或者views\.decorators\.cache\.cache_(?:page|header)\.([[:alnum:]]+)\.(?:GET\.)?([[:alnum:].]+)\.en-us\.UTC?预期的结果是什么? documentation 是一个不错的起点。 @WiktorStribiżew 谢谢它在每个点之前没有“\”但我最终得到了类似'views.decorators.cache.cache_page.THE_PREFIX.GET.([[:alnum:]] +).THE_LAST_HASH.en-us.UTC' 感谢您帮助我完成那个 alnum 部分,我很讨厌正则表达式 您需要转义.,否则它将匹配任何字符。看看here。 【参考方案1】:

你可能会使用

views\.decorators\.cache\.cache_(?:page|header)\.([[:alnum:]]+)\.(?:GET\.)?([[:alnum:]]+)(?:\.[[:alnum:]]+)?\.en-us\.UTC

请参阅regex demo。它匹配

views\.decorators\.cache\.cache_ - 固定的views.decorators.cache.cache_ 字符串 (?:page|header) - pageheader \. - 一个点 ([[:alnum:]]+) - 第 1 组:一个或多个字母数字 \. - 一个点 (?:GET\.)? - 一个可选的 GET. 字符串 ([[:alnum:]]+) - 第 2 组:一个或多个字母数字 (?:\.[[:alnum:]]+)? - . 的可选出现,然后是一个或多个字母数字字符序列 \.en-us\.UTC - .en-us.UTC 字符串。

【讨论】:

是的,我添加了反斜杠并且它起作用了,我是从 python 执行的,所以在我猜之前我一定有一些错字。而且,感谢您的详细回答,我现在似乎明白了一些。非常感谢,谢谢!

以上是关于postgres 与正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何使用动态正则表达式匹配 Postgres 中的值

Postgres中的正则表达式查找和替换

如何修改一个正则表达式的匹配方式

Perl正则表达式匹配多行文件与匹配变量如何处理换行

正则表达式分组与 C++ 11 正则表达式库匹配

php正则表达式的匹配与替换