正则表达式:匹配两个正则表达式

时间:2016-03-05 13:11:26

标签: regex

假设我们有字符串集合作为输入:

str1: ABCD
str2: ABCD
str3: AWXYD
str4: AWXYD

目标是删除重复项并保留唯一项。有了上面的输入,我们的输出应该如下所示:

ABCD
AWXYD

不幸的是,生成此集合的计算机容易出错,有时会遗漏一些字母表(见下文)。幸运的是,我们能够发现缺少部分。但我们不知道这个缺失的部分有多大。实际上我们有以下输入:

str1: A?CD
str2: AB?D
str3: AWXYD
str4: A?D

其中?表示缺少部分。

在此示例中,我们希望保留A?CDAB?D以及AWXYD

为了解决这个问题,我用?替换.*并假设这些字符串是正则表达式:

Reg1 --> A.*CD
Reg2 --> AB.*D
Reg3 --> AWXYD
Reg4 --> A.*D

现在我试图通过比较正则表达式来识别重复项。使用此方法,可以轻松地将Reg4Reg3匹配,因为Reg3实际上是一个字符串(没有丢失的部分)。当两者都缺少部件时,事情变得复杂,因此你必须比较正则表达式。

我想知道是否有可能或者是否有更好的解决方案。

谢谢!

修改1 :请注意,str1str2可能来自不同的字符串(例如AXCDABXD)。我们的目标是删除任何(可能的)重复项,并确保保留的字符串是唯一的(即使我们删除更多)。这就是我们保留str1str2的原因。感谢Aaron指出了这一点。

编辑2 :有数百万字符串。这就是为什么需要算法的原因。

2 个答案:

答案 0 :(得分:2)

我不认为正则表达式适合这样的任务。如果您询问是否有实现的方式来比较正则表达式,则答案为否。至少我还没有看到它。如果你问是否有办法实现它,我会说是的。您可以将正则表达式表示为有限状态机以及图形。并且可以检查这些事物的同构性。但是为正则表达式做这件事会非常复杂。我现在脑子里想到的三件事是:Levenshtein distance algorithmBinary search tree(搜索效率极高的数据结构)和Black Board architecture。而且here你会找到几个可以帮助你的答案。祝你好运!

P.S PostgreSQL有fuzzystrmatch模块和Levenshtein算法实现。

答案 1 :(得分:0)

我认为问题在于你的模式。

Reg1 --> A.*CD

Reg2 --> AB.*D

有时,它们代表相同的模式,例如。

ABCD

Reg1Reg2可与此文字匹配。这意味着Reg1Reg2内部存在一些重复的模式。

您可以通过将模式更改为

来解决问题
Reg1 --> A(?!B).*CD
// (?!B) means the second character can be any letters except `B`

Reg2 --> A.*(?<!C)D
// (?<!C) means the second last character can be any letters except `C`

否则你无法区分这两种模式。