r - 评估正则表达式模式是否始终与另一种模式匹配相同或更多



编辑:这在没有理由的情况下被关闭了,因为太宽泛了,我相信这是一个错误。 还提出了一个重复的问题:正则表达式:确定两个正则表达式是否可以匹配相同的输入? 它很相似,但我是一个 R 问题,它不问两个表达式是否匹配相同,而是如果一个匹配包含另一个的匹配,并且我理想的输出是一个实用函数,或者我可以用来构建一个的提示,链接的理论对于 R 程序员来说有点压倒性。 作为旁注,这个链接的问题有 40+ 票,尽管比我的更广泛,但从未关闭。


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

例如,.*匹配所有内容,因此,命名fun我想要的功能,我们必须fun(".*", "foo")TRUE因为如果匹配"foo"".*"也会匹配。

返回TRUE的其他呼叫将是:

fun("[ab]","a")
fun("\D","^\D{2}$")

如果我还原上面示例的参数,或者如果我有两种可能重叠的模式,它应该返回FALSE.

我希望能够仅从模式中做到这一点,而不是首先在数据上测试它们。我该怎么做?

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

正则表达式足够强大,可以做非常酷的事情,比如用正则表达式解决 3-Sat。

任何允许组和前瞻的正则表达式都有点像 CFG(有时它似乎更弱,但有时更强),所以我觉得你正在尝试直接解决一个无法决定的问题

更直接地说,可能更容易证明您的解决方案解决了 Post 通信问题,这是不可判定的。

为了矛盾起见,假设你成功地编写了你的函数。我们现在正在尝试解决邮政通信问题,因此我们得到了 2 个单词列表。 在接下来的过程中,我将尝试使用维基百科中的示例,也就是说,我将演示的列表是['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,依此类推。

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

这是 rubular 中的示例

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

如果我们的"测试文本"以aabbbaXXXbaaaabb开头,将使 \1 匹配a和 \4 匹配baa

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

这解决了无法判定的邮政通信问题。

我们使用更"高级"的正则表达式功能来使其工作。如果我们不使用它们,我们将获得 2 种常规语言。比较这些既是理论上的任务,也是实践上的任务,即构建一个在两者上传播的自动机,然后检查第二台机器的接受状态是否都包含在第二台机器的接受状态中。

最新更新