能否使用Z3求解满足给定字符串样例的最简正则表达式?
基于Microsoft Z3求解匹配指定字符串集的最简正则表达式
完全可以通过Microsoft Z3实现该需求,对应你给出的样本集{"01", "001", "000111", "01111"},确实可以求解得到预期结果0*1*,具体实现逻辑如下:
- 首先明确约束条件:第一,生成的正则表达式必须匹配所有输入的正样本;第二,你需要先定义“最简”的量化标准,通常按正则的语法长度、或者等价DFA的状态数来判定,数值越小越简单。
- 建模时可以优先用正则等价的有限状态自动机(DFA)做中间载体:把DFA的状态、转移规则、接受状态都定义为Z3的求解变量,添加约束要求所有输入样本都能被该DFA接受,再通过最小化DFA的状态数完成求解。
- 得到最小状态的DFA后,直接转换为等价的正则表达式即可,你给出的样本对应的最简DFA仅包含3个状态,转换后就是
0*1*。 - 如果没有负样本做限制,求解时可能会得到
.*这类过泛的结果,你可以额外添加约束限定正则允许使用的运算符(比如仅允许0、1字面量、*、字符串拼接等),即可得到符合预期的结构。 - 也可以换更直接的实现思路:按长度从小到大枚举正则候选,用Z3验证候选是否满足匹配所有样本的约束,第一个满足条件的就是你要的最简正则。
内容的提问来源于stack exchange,提问作者Mojtaba Valizadeh
相关产品推荐
相关产品推荐

