Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 检查“LIKE”模式在Postgres中是否相交_Regex_Postgresql - Fatal编程技术网

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')