如果我有一个正则表达式列表,是否有一种简单的方法可以确定它们中没有两个都会返回相同字符串的匹配项?
也就是说,当且仅当对于所有字符串,列表中的一个项目最多匹配整个字符串时,该列表才有效。
这似乎很难(可能不可能?)来明确证明,但我似乎无法找到关于这个主题的任何工作。
我问的原因是我正在使用接受正则表达式的标记化器,我想确保一次只有一个标记可以匹配输入的头部。
答案 0 :(得分:6)
如果您正在处理纯正则表达式(没有反向引用或其他功能导致它们识别无上下文或更复杂的语言),您可以提出的问题。 您可以做的是将每个正则表达式转换为DFA,然后(因为常规语言在交集处关闭)将它们组合成一个可识别的DFA 这两种语言的交集。如果该DFA具有从开始状态到接受状态的路径,则该输入regexen都接受该字符串。
这个问题是通常的regex-> DFA算法的第一步是 将正则表达式转换为NFA,然后将NFA转换为DFA。但最后一步可以 导致DFA状态数呈指数式爆炸,因此这只会是 对于非常简单的正则表达式是可行的。
如果您正在使用扩展的正则表达式语法,那么所有的赌注都是关闭的:无上下文语言 在交叉点下没有关闭,所以这种方法不起作用。
答案 1 :(得分:1)
Wkipedia article on regular expressions确实陈述
可以编写一种算法,对于两个给定的正则表达式,判断所描述的语言是否基本相等,将每个表达式减少到最小确定性有限状态机,并确定它们是否是同构的(等价的)。 / em>的
但没有提供进一步的提示。
当然,您所接受的简单方法是进行大量测试 - 但我们都知道测试作为证明方法的缺点。
答案 2 :(得分:1)
只有查看正则表达式才能做到这一点。
考虑您有[0-9]
和[0-9]+
的情况。它们显然是不同的表达式,但当应用于字符串“1”时,它们都产生相同的结果。当应用于字符串“11”时,它们产生不同的结果。
重点是正则表达式信息不足。结果取决于正则表达式和目标字符串。