gpt4 book ai didi

regex - 检查 `LIKE` 模式是否在 Postgres 中相交

转载 作者:行者123 更新时间:2023-11-29 11:30:05 27 4
gpt4 key购买 nike

在某些请求中有两个字符串是在 LIKE 表达式中使用的模式(带有 _% 占位符)。我想知道这个模式是否相交(有一些字符串匹配它们)。有什么办法吗?...


“Like pattern”对应于 finit 或 infinit 字符串集。该集合中的每个字符串都匹配给定的模式。我想检查两个给定模式的字符串集的交集是否不为空。因此,最好说模式合取。用数学语言:

S — set of strings
P — set of patterns (where each pattern has one or more string representation)

Sᵢ — subset of strings (Sᵢ ⊂ S) that match pᵢ pattern (where instead of i could be any index). In equation form: “Sᵢ = {s | s ∈ S, s matches pᵢ, pᵢ ∈ P}” — that meas: “Sᵢ is a set of elements that are strings and match pᵢ pattern”. Or another notation: “Sᵢ ⊂ S, ∀pᵢ ∈ P ∀s ∈ S (s matches pᵢ ≡ s ∈ Sᵢ)” — that meas: “Sᵢ is subset of strings and any string is element of Sᵢ if it matches pᵢ pattern”.

Let's define conjunction of patterns: “p₁ ∧ p₂ = p₃ ≡ S₁ ∩ S₂ = S₃” — that means: “Set of strings that match conjunction of patterns p₁ and p₂ is intersection of sets of strings that match p₁ pattern and that match p₂ pattern”.


例如:

  • ab_d%cd — 相交
  • k%nkl___ — 相交

最佳答案

I want to find if this patterns intersects (have some string that matches them both). Is there any way to do that?... (...) I want to check if intersection of string sets for two given patterns is not empty.

因此,如果我没看错,给定两个相似的模式 p1 和 p2,您感兴趣的是是否存在(尚未确定)与 p1 和 p2 匹配的字符串。

例如:

select check_pattern('a%', 'b_'); -- false
select check_pattern('a%', '_b'); -- true ('ab')

您是否确定存在针对该问题的通用解决方案?

假设有,纯 SQL 不是找到解决方案恕我直言的正确工具,因为您不能轻易地用“这是我的(有限)数据集,加入/过滤它们并根据它”。要用 SQL 术语找到解决方案,您需要生成源自您的数据的集合,当所讨论的集合是无限的时,这显然不是一个选项。

我认为您希望将问题分解成更小的部分,并使用 C、Perl、Lisp 等过程语言,无论您喜欢什么。

一个潜在的解决方案可能是这样的:

  • 如果 p1 和 p2 在两端或不同端都是开放的,答案很简单:匹配 %foo% 的字符串将与匹配 %bar%< 的字符串相交,正如匹配 foo% 的字符串将与匹配 %bar 的字符串相交。

  • 如果 p1 产生一个有限集(即它不包含 %),您可以想象使用 generate_series() 迭代 p1 的整个潜在匹配集或 for/while/whatever 循环,并在每个字符串上尝试 p2。它丑陋且低效,但它最终会起作用。

  • 如果 p1 和 p2 都被锚定(例如 abc%def%%abc%def ),或合理锚定(例如 _abc%abcd%)解决方案也足够简单,只需考虑锚定部分并像前面的情况一样继续.

  • 剩下的情况就交给你来列举解决了...

我认为,关键是确定模式中产生有限字符串集的锚定部分,并坚持检查它们将匹配的(有限)字符串集是否相交。

关于regex - 检查 `LIKE` 模式是否在 Postgres 中相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16013172/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com