5
4

1 回答 1

1

我想知道这个模式是否相交(有一些字符串匹配它们)。有没有办法做到这一点?...(...)我想检查两个给定模式的字符串集的交集是否不为空。

所以,如果我做对了,给定两个相似的模式 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 产生一个有限集(即它包含 no %),您可以想象使用generate_series()orfor/while/whatever循环迭代 p1 的整个潜在匹配集,并在每个字符串上尝试 p2 。它丑陋且效率低下,但最终会奏效。

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

  • 如果有的话,我会把它留给你来列举和解决剩余的案例......

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

于 2013-04-27T08:58:04.837 回答