-
一个用MASM写的正则表达式引擎
此正则表达式引擎属于正统的NFA引擎,基本兼容Perl,简单说一下引擎是怎么实现的:
首先做一个递归下降语法分析,利用栈把正则表达式转换成NFA(以有向图的形式表现),再遍历NFA判断是否能到达完成节点。
实现正则表达式匹配的各种复杂功能的力量来自于回溯,而回溯的基础是栈,回溯能力是通过栈来达成的。
栈中保存了匹配路径中所有的状态,状态回溯就是出栈,状态匹配就是入栈。
除了回溯,一些扩展功能的实现也是通过栈来完成的,比如捕获和零宽断言,都要通过搜索或操纵栈来完成。
转换成NFA再匹配的好处是简化匹配和利于优化和DEBUG:因为不管再复杂的表达式转换成NFA之后只有边和节点组成,边和节点也只有顺序、分支、循环这三种形式组成。
详细原理说明看下面关于实现引擎的文章,第3条是我理解引擎匹配原理的入门参考。
支持GBK和UTF8编码
==参考和学习资料==
关于实现引擎的文章:
1、《Perl语言编程》第五章 书
2、《精通正则表达式》 书
3、构造正则表达式引擎 http://www.cppblog.com/vczh/archive/2008/05/22/50763.html 我的原理学习入门参考
4、NFA引擎匹配原理 http://blog.csdn.net/lxcnn/article/details/4304651
5、英文参考资料 请点击左侧文件开始预览 !预览只提供20%的代码片段,完整代码需下载后查看 加载中 侵权举报
- 2022-05-27 18:36:44下载
- 积分:1
-
偏最小二乘法,用于回归分析,构建回归方程,预测准确度高...
偏最小二乘法,用于回归分析,构建回归方程,预测准确度高
- 2022-05-26 07:16:37下载
- 积分:1
-
这是粒子群算法的一个源程序,程序很简单,已经运行过了,可以用,对初学者是个不错的程序...
这是粒子群算法的一个源程序,程序很简单,已经运行过了,可以用,对初学者是个不错的程序-This is a source particle swarm optimization algorithm, the program is very simple, has been running over us, we can use, for beginners is a good program
- 2022-08-08 21:47:13下载
- 积分:1
-
修剪草坪
有一个n*m的草坪(1
- 2022-03-17 14:35:40下载
- 积分:1
-
matlab语音识别算法的改进
应用背景基于HMM算法的MATLAB的语关键字识别,比较成熟的小系统,供初学者学习下载,有助于帮助初学者了解语音识别的几本过程,其中提供的一些程序可以改进,识别为一些基本词汇,从建模训练到语音识别关键技术识别过程:识别的前面部分与训练相似,都是要计算得到mfcc系数,不同在于,识别时,将计算得到的mfcc 参数分别代入训练得到的HMM模板求出概率,比较出最大概率者,则该模板对应的数字就是识别的数字。用大量语音文件做测试,结果正确率为90%以上。训练及识别数据太大,少量上传一点,大家可以用COOLEDIT等软件仿照自己制作
- 2022-01-25 22:09:14下载
- 积分:1
-
用C语言实现大整数相乘问题
用C语言实现大整数相乘问题-C Language large integer multiplication problems
- 2022-05-26 22:27:39下载
- 积分:1
-
免疫算法与遗传算法类似,主要用于求解最优化问题。
免疫算法与遗传算法类似,主要用于求解最优化问题。-Immune algorithm and genetic algorithm is similar, mainly for solving optimization problems.
- 2022-05-24 12:54:53下载
- 积分:1
-
卫星位置坐标解算
卫星位置坐标解算,未经地球自转和相对论影响处理的卫星坐标在wgs-84下的坐标
- 2023-06-03 06:35:03下载
- 积分:1
-
数值分析相关问题代码,数据拟合
利用数值分析方法进行数据拟合#include
#include
#include
void main()
{
int i;
float a[3];
float x[16];
float y[16];
void Approx(float[],float[],int,int,float[]);
Approx(x,y,16,2,a);
for(i=0;i
- 2022-03-25 20:23:44下载
- 积分:1
-
鼹鼠闯迷宫
资源描述void creatWay(int (*mg)[N],int x, int y)//在迷宫中产生一条路,使用图的深度遍历思想来实现,
{
static int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};////将要走的4个方向保存在二维数组中
int zx = x*2;
int zy = y*2;
int next, turn, i;
mg[zx][zy] = 0;
if(rand()%2)
turn = 1;
else
turn = 3;
for(i=0,next=rand()%4;i
- 2022-01-26 05:46:58下载
- 积分:1