Regex 检查“LIKE”模式在Postgres中是否相交
在某些请求中有两个字符串,它们是Regex 检查“LIKE”模式在Postgres中是否相交,regex,postgresql,Regex,Postgresql,在某些请求中有两个字符串,它们是中使用的模式,比如表达式(带有和%占位符)。我想知道这个模式是否相交(有一些字符串与它们匹配)。有什么办法吗 “Like pattern”对应于有限或无限的字符串集。此集合中的每个字符串都与给定的模式匹配。我想检查两个给定模式的字符串集的交集是否为空。因此,最好说模式连接。在数学语言中: S-字符串集 P-模式集(其中每个模式有一个或多个字符串表示) ᵢ — 字符串的子集ᵢ ⊂ S) 那场比赛是pᵢ 模式(其中i可以是任何索引)。 方程形式:“Sᵢ = {s|s
中使用的模式,比如表达式(带有
和%
占位符)。我想知道这个模式是否相交(有一些字符串与它们匹配)。有什么办法吗
“Like pattern”对应于有限或无限的字符串集。此集合中的每个字符串都与给定的模式匹配。我想检查两个给定模式的字符串集的交集是否为空。因此,最好说模式连接。在数学语言中:
S-字符串集
P-模式集(其中每个模式有一个或多个字符串表示)
ᵢ — 字符串的子集ᵢ ⊂ S) 那场比赛是pᵢ 模式(其中i可以是任何索引)。
方程形式:“Sᵢ = {s|s∈ S、 S匹配pᵢ, Pᵢ ∈ P} -这意味着:“Sᵢ 是一组字符串元素,与p匹配ᵢ 模式”。
或者另一种符号:“S”ᵢ ⊂ s∀Pᵢ ∈ P∀s∈ S(S)与p匹配ᵢ ≡ s∈ sᵢ)” — 这意味着:“Sᵢ 是字符串的子集,任何字符串都是S的元素ᵢ 如果它匹配pᵢ 模式”
让我们定义模式的连接:“p₁ ∧ P₂ = P₃ ≡ s₁ ∩ s₂ = s₃” — 这意味着:“匹配模式p的连词的字符串集₁ 和p₂ 是匹配p的字符串集的交点₁ 模式和匹配的p₂ 模式”
例如:
ab_d
和%cd
相交
k%n
和kl\uuuuu
相交
我想知道这个模式是否相交(有一些字符串与它们匹配)。有什么方法可以做到这一点吗?…(…)我想检查两个给定模式的字符串集的相交是否为空
所以,如果我理解正确,给定两个相似的模式,p1和p2,您会感兴趣的是是否存在一个与p1和p2匹配的字符串(尚未确定)
例如:
你确定一开始就有一个通用的解决方案吗
假设有,纯SQL不是找到imho解决方案的正确工具,因为您无法用“这是我的(有限)数据集,连接/过滤它们并基于它生成一个集”来表示这一点。要用SQL术语找到解决方案,您需要生成源于数据的集合,而当所讨论的集合是无限的时,这显然不是一个选项
我想你应该把这个问题分成几个小部分,然后使用过程语言,比如C、Perl、Lisp,随便你喜欢什么
一个可能的解决方案可能是:
- 如果p1和p2在两端或不同的一端都是开放的,答案是肯定的:匹配
%foo%
的字符串将与匹配%bar%
的字符串相交,就像匹配foo%
的字符串将与匹配%bar
的字符串相交一样
- 如果p1生成一个有限集(即它不包含
%
),您可以想象使用generate_series()
或for/while/where
循环迭代p1的整个潜在匹配集,然后在每个字符串上尝试p2。这既丑陋又低效,但最终会起作用
- 如果p1和p2都被锚定(例如
abc%
和def%
或%abc
和%def
),或被合理锚定(例如\u abc%
和abcd%
),那么通过考虑锚定部分并像前面的情况一样继续,解决方案也就足够简单了
- 我会让你列举并解决剩余的案件,如果有的话
我认为,关键在于确定模式中产生有限串的锚定部分,并坚持检查(有限的)它们将匹配的一组字符串将相交。您想知道它们是在给定正确字符串的情况下相交,还是在已知字符串集上相交?要针对多个模式测试字符串,您可以使用LIKE ALL
,例如:选择'comm'LIKE ALL(数组[''''um','co%'))
。但是,弄清楚任何两个模式是否都有一个或多个两个模式都匹配的字符串……这很难。一种方法可能是从一个模式创建候选字符串,然后将它们与另一个模式匹配,但这会非常缓慢和不完美。我怀疑您在SQL中无法轻松解决这个问题。在我的回答中(我现在已删除了该回答)Errandir发表了评论“但是不能有'%mm'
字符串与'omm'
和'co%'
相交,而不是'comm'
?”。我不明白您在问什么。您是否希望找到正好匹配一个公共字符串的模式,而没有两个或更多的字符串同时匹配这两个字符串?请编辑您的问题,更好地解释您的问题,并添加更多根据您要实现的规则匹配和不匹配的模式示例-以及为什么。co你能定义“相交”吗?a%
会与%b
相交吗?我问这个问题是因为你的例子都有非占位符。如果是这样,我们会假设%
与所有东西相交吗?@ChrisTravers是:a%
∧ <代码>%b
=a%b
≠ ∅. 哪里∅ — 没有与之匹配的字符串的模式。
select check_pattern('a%', 'b_'); -- false
select check_pattern('a%', '_b'); -- true ('ab')