评估正则表达式模式是否总是与另一个模式匹配相同或更多

时间:2019-07-13 13:30:41

标签: r regex

编辑:这项工作被广泛关闭,没有理由,我认为这是一个错误。 还提出了一个重复的问题:Regex: Determine if two regular expressions could match for the same input? 相似,但是我的是一个R问题,它不询问两个表达式是否匹配相同,但是一个匹配项是否包含另一个匹配项,而我的理想输出是一个实用函数,或可以用来构建一个的提示,理论链接对于R程序员来说有点不知所措。 附带说明一下,该链接的问题有40多个投票,尽管范围比我的还要广泛,但从未关闭过。


我想评估一个正则表达式模式在任何情况下是否都将与另一个模式匹配。

例如config = { 'bucket': json.loads(record['body']) ['Records'][0]['s3']['bucket']['name'], 'key': json.loads(record['body']) ['Records'][0]['s3']['object']['key'] } 匹配所有内容,因此,将.*命名为我想要的功能,我们将fun设为fun(".*", "foo"),因为如果{{1 }}被匹配,TRUE也将被匹配。

其他返回"foo"的呼叫将是:

".*"

如果我还原上述示例的参数,或者如果我有两个可能重叠的模式,则它应该返回TRUE

我希望能够仅通过模式来做到这一点,而不是先对数据进行测试。我该怎么办?

1 个答案:

答案 0 :(得分:3)

假设您使用的是与perl兼容的标准正则表达式,它实际上并不是regular,但实际上要强大得多,答案是您不能

Regex足够强大,可以执行诸如Solving 3-Sat with regex之类的很棒的事情。

任何允许groupslookahead的正则表达式都有点像CFG(有时似乎较弱,但有时更强),所以我觉得您正在尝试直接解决undecidable problem

更直接地,更容易证明您的解决方案解决了Post correspondence problem,这是不确定的。

为了矛盾起见,假设您成功编写了函数。现在,我们正在尝试解决帖子对应问题,因此我们得到了2个单词列表。 在接下来的所有内容中,我将尝试使用Wikipedia中的示例,即,我将演示的列表为['a','ab','bba']和['baa','aa','bb']

作为第一个参数,我们将为您的函数提供类似于^$的函数。第二,我们将构建一个正则表达式,如果它是解决邮政信件问题的一种解决方案,则可以接受一个单词。

我们将构造正则表达式,以便每个组对应一个特定的单词,然后要求正则表达式将一个单词与第一个列表和第二个列表的重复匹配。

这是一个例子:

^(?:(a))(?:(ab))(?:(bba))XXX(?:(baa))(?:(aa))(?:(bb))YYY(?:(\1?\2?\3?)*$)(?:(\4?\5?\6?)*$)

直到第一个分隔符XXX,我们将\ 1组分配给a,依此类推。 直到第二个分隔符YYY,我们将\ 4组分配给baa,依此类推。

在第二个分隔符之后,我们要求找到第一组单词的重复,也就是第二组单词的重复。

Here's the example in rubular

(?:(a))(?:(ab))(?:(bba))XXX(?:(baa))(?:(aa))(?:(bb))

如果我们的“测试文本”以a开头,则\ 1匹配baa和\ 4匹配aabbbaXXXbaaaabb

要包装起来,而不是空字符串,我们检查它是否包含在正则表达式中,而该正则表达式只是前缀,即是否 fun("^aabbbaXXXbaaaabbYYY$",<our huge regex>)是真实的

这解决了无法确定的帖子对应问题。

我们使用了更多的“高级”正则表达式功能来使其工作。如果我们不使用它们,我们将获得2种常规语言。进行比较是构建在两者上运行的自动机的理论和实践任务,然后检查第二台机器的接受状态是否全部包含在第二台机器的接受状态中。