正则表达式分组算法:Yu算法
2016-09-19 19:28
309 查看
Yu算法的提出
Yu等人首次提出了正则表达式分组的概念,同时提出了Yu算法。
在研究中提出如下假设:
存在正则表达式 R1、R2、R3,在合并正则表达式时,如果 R1 与 R2 互不影 响,R2 与 R3 互不影响,则可以认为 R1 与 R3 互不影响。
该假设并没有提供出实际的数学证明,只是通过大量实验检测不满足假设的概率极低可以忽略不计。
Yu算法的内容
Yu 算法通过计算两两正则表达式之间的 DFA 状态数变化情况来构造正则表达式互相影响图 G,在图 G 中,以一个顶点表 示一个正则表达式,如果两个正则表达式之间互相影响,在代表这两个正则表达式 的两个顶点之间连上一条边。算法通过检测图 G,不断将与分组中正则表达式相互 作用数最少的正则表达式加入到分组中,来完成正则表达式的分组。
Yu算法流程
(1) 计算所有正则表达式Ri与Rj之间的互相影响,其中,1 < i < j < n,并构建正则表达式影响图 G。
(2) 如果待分组正则表达式数量为 0,结束算法,否则,新建一个空的正则表达式分组 NG,在图 G 中选择一个度数最少的顶点加入到该分组中。
(3) 在图中选择与分组NG中顶点间交互边最少的顶点V,加入到分组NG中。
(4) 如果此时分组 NG 构造的 DFA 所占存储空小于阈值,将正则表达式 V 加入到 NG 中,从 G 中删除 V,跳转到第(3)步,如果达到阈值,输出分组NG,并跳转到第(2)步。
Yu算法在做的时候会给每一个分组设定一个阈值,当分组中正则表达式转化为DFA后状态数超过阈值,那则输出分组。若此时还有正则表达式则再创建一个分组接着(2)继续往下走。
Yu等人还总结了单条正则表达式转化为DFA自身状态发生爆炸的原因,其中第一种 与第二种情况为线性增长,第三与第四种情况为平方级增长第五种情况为指数级 增长。并对第后两种方案提出了改写方案,使得后两种正则表达式转换为前两种结构:
改进方法:
比如对于^B+[^\n]{3}D,编译 成 DFA 后如图,发生了状态爆炸。
原因在于:正则表达式在匹配了第一个 B 之后,如果遇到连续多个字符 B 组成的字符串,则之后遇到的每一个字符 B 有可能属于匹配“B+”的一部分或者 匹配“[^\n]{3}”的一部分,此时,为了正确判断下一个输入的字符,DFA 需要对扫过的字符 B 的个数进行记录。所以如果[^\n]后面的长度限制为 k,则需要O(k2) (2是平方的意思)个状态来记录到达第一个匹配的字符 B 以及到达最后一个匹配的字符 B 的距离。
对于指数级增长的正则表达式的改写:
通常一个模式如果可以匹配 k 个任意字符,那么需要O(2k)(2的k次方)个状态来处理这 k 次匹配。Yu 等人指出,Snort 系统[2]中存在 53.8%的正则表达式含有统配符与长度限定符这一组合,但其中有 80%的正则表达式以“^”开始,剩下 20%的正则表达式则会 产生状态爆炸的情况[18]。比如 Snort 系统中的 IMAP 授权协议中,存在如下模式: “.*AUTH\s[^\n]{100}”,这一表达式构造的 DFA 状态数超过了 10000 个,因为 DFA 中需要记录所有可能的 AUTH\s 字符串的匹配。为了减少这一结构的正则表达式对于最终产生的 DFA 状态数的影响,对正则 表达式进行如下改写:将正则表达式中的通配符转换为确定的模式,例如,将正则 表达式“.*AUTH\s[^\n]{100}”改写为:
此时将正则表达式由表 的第五种情况转换为表 中的第 2 种情况,使得 正则表达式构造的 DFA 状态数由O(k + 2j )减少为 O(k * j)。
Yu算法还存在的不足:
(1) 该算法中对于正则表达式的改写只是针对了少数几种特殊情况,并不能处 理大多数的正则表达式,所以正则表达式的改写部分在实际应用中效果有限。
(2) 该算法考虑了正则表达式间是否存在相互作用,但并不考虑两条正则表达式合并后使得 DFA 状态数减少的情况,同时在度量正则表达式相互作用 时并没有给出相互作用对状态数影响大小的评估。
(3) 该算法在运行前期可能会把特征模式集中所有与其他正则表达式相互作 用小的表达式挑选出来组成开始的几个分组,在算法的运行后期将留下所 有“不良”的表达式,并在他们之中进行分组。
虽然Yu算法有些许不足,但是在某些情况下我们可以应用到里面的一些核心思想来满足我们的算法要求。
Yu等人首次提出了正则表达式分组的概念,同时提出了Yu算法。
在研究中提出如下假设:
存在正则表达式 R1、R2、R3,在合并正则表达式时,如果 R1 与 R2 互不影 响,R2 与 R3 互不影响,则可以认为 R1 与 R3 互不影响。
该假设并没有提供出实际的数学证明,只是通过大量实验检测不满足假设的概率极低可以忽略不计。
Yu算法的内容
Yu 算法通过计算两两正则表达式之间的 DFA 状态数变化情况来构造正则表达式互相影响图 G,在图 G 中,以一个顶点表 示一个正则表达式,如果两个正则表达式之间互相影响,在代表这两个正则表达式 的两个顶点之间连上一条边。算法通过检测图 G,不断将与分组中正则表达式相互 作用数最少的正则表达式加入到分组中,来完成正则表达式的分组。
Yu算法流程
(1) 计算所有正则表达式Ri与Rj之间的互相影响,其中,1 < i < j < n,并构建正则表达式影响图 G。
(2) 如果待分组正则表达式数量为 0,结束算法,否则,新建一个空的正则表达式分组 NG,在图 G 中选择一个度数最少的顶点加入到该分组中。
(3) 在图中选择与分组NG中顶点间交互边最少的顶点V,加入到分组NG中。
(4) 如果此时分组 NG 构造的 DFA 所占存储空小于阈值,将正则表达式 V 加入到 NG 中,从 G 中删除 V,跳转到第(3)步,如果达到阈值,输出分组NG,并跳转到第(2)步。
Yu算法在做的时候会给每一个分组设定一个阈值,当分组中正则表达式转化为DFA后状态数超过阈值,那则输出分组。若此时还有正则表达式则再创建一个分组接着(2)继续往下走。
Yu等人还总结了单条正则表达式转化为DFA自身状态发生爆炸的原因,其中第一种 与第二种情况为线性增长,第三与第四种情况为平方级增长第五种情况为指数级 增长。并对第后两种方案提出了改写方案,使得后两种正则表达式转换为前两种结构:
改进方法:
比如对于^B+[^\n]{3}D,编译 成 DFA 后如图,发生了状态爆炸。
原因在于:正则表达式在匹配了第一个 B 之后,如果遇到连续多个字符 B 组成的字符串,则之后遇到的每一个字符 B 有可能属于匹配“B+”的一部分或者 匹配“[^\n]{3}”的一部分,此时,为了正确判断下一个输入的字符,DFA 需要对扫过的字符 B 的个数进行记录。所以如果[^\n]后面的长度限制为 k,则需要O(k2) (2是平方的意思)个状态来记录到达第一个匹配的字符 B 以及到达最后一个匹配的字符 B 的距离。
对于指数级增长的正则表达式的改写:
通常一个模式如果可以匹配 k 个任意字符,那么需要O(2k)(2的k次方)个状态来处理这 k 次匹配。Yu 等人指出,Snort 系统[2]中存在 53.8%的正则表达式含有统配符与长度限定符这一组合,但其中有 80%的正则表达式以“^”开始,剩下 20%的正则表达式则会 产生状态爆炸的情况[18]。比如 Snort 系统中的 IMAP 授权协议中,存在如下模式: “.*AUTH\s[^\n]{100}”,这一表达式构造的 DFA 状态数超过了 10000 个,因为 DFA 中需要记录所有可能的 AUTH\s 字符串的匹配。为了减少这一结构的正则表达式对于最终产生的 DFA 状态数的影响,对正则 表达式进行如下改写:将正则表达式中的通配符转换为确定的模式,例如,将正则 表达式“.*AUTH\s[^\n]{100}”改写为:
“([^A]|A[^U]|AU[^T]|AUT[^H]|AUTH[^\s]|AUTH\s[^\n]{0,99}\n)*AUTH\s[^\n]{100}”
此时将正则表达式由表 的第五种情况转换为表 中的第 2 种情况,使得 正则表达式构造的 DFA 状态数由O(k + 2j )减少为 O(k * j)。
Yu算法还存在的不足:
(1) 该算法中对于正则表达式的改写只是针对了少数几种特殊情况,并不能处 理大多数的正则表达式,所以正则表达式的改写部分在实际应用中效果有限。
(2) 该算法考虑了正则表达式间是否存在相互作用,但并不考虑两条正则表达式合并后使得 DFA 状态数减少的情况,同时在度量正则表达式相互作用 时并没有给出相互作用对状态数影响大小的评估。
(3) 该算法在运行前期可能会把特征模式集中所有与其他正则表达式相互作 用小的表达式挑选出来组成开始的几个分组,在算法的运行后期将留下所 有“不良”的表达式,并在他们之中进行分组。
虽然Yu算法有些许不足,但是在某些情况下我们可以应用到里面的一些核心思想来满足我们的算法要求。
相关文章推荐
- OLE-LABEL
- PHP——冒泡排序算法
- 线程
- 实现可自由拖动的view
- cuda 程序
- 欧拉函数
- HTML/CSS: 用CSS与HTML实现表格的显示
- 更好的PHP错误处理
- hdu 1412 {A} + {B}
- PowerDesigner逆向工程导入MYSQL数据库总结
- ural 1110,快速幂
- 2016 ACM/ICPC Asia Regional Shenyang Online HDU 5900 QSC and Master(区间dp水题)
- 单位转换类UnitUtil2
- Python版libsvm安装
- iOS视频播放
- bzoj 1026: [SCOI2009]windy数 (数位dp)
- 第三方okhttp网络访问框架使用教程
- 超像素分割技术发展情况梳理(Superpixel Segmentation)
- 用story review meeting 来准备 sprint planning
- JavaScript的核心