正则表达式在c++中的实现
这个是最基础的解释器,它实现了串联、并联、克林闭包,字符集为除了()|*的ASCII字符,而且不能判断表达式合法,效率还很低,内存利用率低。
它只能判读输入的字符串是否符合表达式。
#include<bits/stdc++.h>
using namespace std;
namespace GDRegex
{
const int EPSILON=-;
const int ISEND=-;
const int MAXN=<<;
struct Node;
struct Edge;
struct Fa;
int TI,c1[MAXN],c2[MAXN];
struct Edge
{
Edge*next;
Node*to;
int w;
};
struct Node
{
Edge*head,*tail;
int num;
Node()
{
num=++TI;
head=new Edge;
head->w=ISEND;
tail=head;
}
inline void add(Node*v,int w)
{
assert(w!=ISEND);
tail->to=v;
tail->w=w;
tail->next=new Edge;
tail=tail->next;
tail->w=ISEND;
}
}*wait1[MAXN],*wait2[MAXN];
struct FA
{
Node*start,*end;
int endPos;
FA()
{
start=new Node();
end=new Node();
start->add(end,EPSILON);
endPos=end->num;
};
FA(int ch)
{
start=new Node();
end=new Node();
start->add(end,ch);
endPos=end->num;
}
FA(string str)
{
start=new Node();
end=new Node();
Node*p=start;
for(int i=;i<str.size();++i)
{
Node*x=new Node;
p->add(x,str[i]);
p=x;
}
p->add(end,EPSILON);
endPos=end->num;
}
bool match(string str)
{
int tot=;
map<pair<int,int>,bool>vis;
int len1=,len2=,len=str.size();
c1[len1]=;
wait1[len1++]=start;
vis[make_pair(,start->num)]=;
while(len1)
{
len2=;
for(int i=;i<len1;++i)
{
Node*u=wait1[i];
for(Edge*e=u->head;e->w!=ISEND;e=e->next)
{
Node*v=e->to;
// cout<<"NOW "<<u->num<<" "<<v->num<<" "<<(char)e->w<<" "<<str[c1[i]]<<" "<<c1[i]<<endl;
++tot;
if(e->w==EPSILON)
{
if(c1[i]==len&&v->num==endPos)
return true;
if(vis[make_pair(v->num,c1[i])])
continue;
c2[len2]=c1[i];
wait2[len2]=v;
vis[make_pair(v->num,c2[len2++])]=;
}
else if(e->w==str[c1[i]]&&!vis[make_pair(v->num,c1[i]+)])
{
if(c1[i]+==len&&v->num==endPos)
return true;
if(c1[i]+>len)
continue;
c2[len2]=c1[i]+;
wait2[len2]=v;
vis[make_pair(v->num,c2[len2++])]=;
}
}
}
for(int i=;i<max(len1,len2);++i)
swap(wait1[i],wait2[i]),swap(c1[i],c2[i]);
swap(len1,len2);
}
return false;
}
};
FA getSeries(const FA&A,const FA&B)
{
FA C=A;
C.end->add(B.start,EPSILON);
C.end=B.end;
C.endPos=B.endPos;
return C;
}
FA getParallel(const FA&A,const FA&B)
{
FA C,D=A,E=B;
C.end->add(D.start,EPSILON);
C.end->add(E.start,EPSILON);
D.end->add(E.end,EPSILON);
C.end=E.end;
C.endPos=E.endPos;
return C;
}
FA getKleene(const FA&A)
{
FA B,C=A;
B.start->add(C.start,EPSILON);
C.end->add(B.start,EPSILON);
return B;
}
FA getFA(string str)
{
stack<pair<FA,int> >S;
for(int i=;i<str.size();++i)
{
if(str[i]=='(')
S.push(make_pair(FA(),));
else if(str[i]==')')
{
pair<FA,int>A=S.top();
S.pop();
while(!S.empty())
{
pair<FA,int>B=S.top();
if(B.second==)
break;
else if(B.second==)
A.first=getSeries(B.first,A.first);
else if(B.second==)
A.first=getParallel(B.first,A.first);
S.pop();
}
A.second=;
S.push(A);
}
else if(str[i]=='*')
{
pair<FA,int>A=S.top();
S.pop();
A.first=getKleene(A.first);
A.second=;
S.push(A);
}
else if(str[i]=='|')
{
pair<FA,int>A=S.top();
S.pop();
while(!S.empty())
{
pair<FA,int>B=S.top();
if(B.second==||B.second==)
break;
A.first=getSeries(B.first,A.first);
S.pop();
}
A.second=;
S.push(A);
}
else
S.push(make_pair(FA(str[i]),));
}
FA A;
while(!S.empty())
{
pair<FA,int>B=S.top();
S.pop();
if(B.second==)
A=getSeries(B.first,A);
else if(B.second==)
A=getParallel(B.first,A);
}
return A;
}
}
int main()
{
ios::sync_with_stdio(false);
using namespace GDRegex;
FA A=getFA("(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)");
while(true)
{
string str;
cin>>str;
cout<<A.match(str)<<endl;
}
return ;
}
2020_02_01
正则表达式在c++中的实现的更多相关文章
- 正则表达式在iOS中的运用
1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- 正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?
解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统总结 ...
- 正则表达式(/[^0-9]/g,'')中的"/g"是什么意思 ?
正则表达式(/[^0-9]/g,'')中的"/g"是什么意思 ? 表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义.我们详细叙述: 1)对于表达式对象的e ...
- JS正则表达式获取字符串中特定字符
JS正则表达式获取字符串中得特定字符,通过replace的回调函数获取. 实现的效果:在字符串中abcdefgname='test'sddfhskshjsfsjdfps中获取name的值test 实 ...
- C#用正则表达式去掉Html中的script脚本和html标签
原文 C#用正则表达式去掉Html中的script脚本和html标签 /// <summary> /// 用正则表达式去掉Html中的script脚本和html标签 ...
- java正则表达式提取地址中的ip和端口号
由于我需要用到java正则表达式提取地址中的ip和端口号,所以我就写了一个demo,测试一下,下面是demo public class Test0810_1 { public static void ...
- 使用Dreamweaver正则表达式替换href中的内容
在Dreamweaver中使用正则表达式替换href中的内容,就像下面这些href中的内容复杂多样的情况下,href="/html/u.html",href="/tuho ...
- 正则表达式在Java中的使用
目录 介绍 从简单例子认识正则表达式匹配 Java中对正则表达式的支持(各种语言有相应的实现) 初步认识 . + * ? 范围 认识\s \w \d - 下面介绍数字和字母的正则表达, 这是编程中使用 ...
- 正则表达式与Python中re模块的使用
正则表达式与Python中re模块的使用 最近做了点爬虫,正则表达式使用的非常多,用Python做的话会用到re模块. 本文总结一下正则表达式与re模块的基础与使用. 另外,给大家介绍一个在线测试正则 ...
- 正则表达式在JS中的使用
<script type="text/javascript"> /** *正则表达式在js中的第一种使用方式: * RegExp 通过构造器去使用正则表达式 需要对反斜 ...
随机推荐
- 百度人脸识别集成错误:Build command failed. Error while executing process F:\dev\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments
大概是这么个错误 Build command failed. Error while executing process F:\dev\Android\Sdk\cmake\3.6.4111459\bi ...
- There is no Action mapped for namespace [/] and action name [login] associate解决办法 .
写了一个JSP项目,在配置struts2时遇到了这个错误,在网上逛了一大圈后终于解决了这个问题.具体解决方法是: 1.struts.xml的名字和位置 这里特别提一点,很多人遇到这个错误都是名字错误, ...
- HDU 2102 A计划 DFS与BFS两种写法 [搜索]
1.题意:一位公主被困在迷宫里,一位勇士前去营救,迷宫为两层,规模为N*M,迷宫入口为(0,0,0),公主的位置用'P'标记:迷宫内,'.'表示空地,'*'表示墙,特殊的,'#'表示时空传输机,走到这 ...
- 《提升能力,涨薪可待》-Java并发之AQS全面详解
欢迎关注公众号[Ccww笔记],原创技术文章第一时间推出 一.AQS是什么?有什么用? AQS全称AbstractQueuedSynchronizer,即抽象的队列同步器,是一种用来构建锁和同步器的框 ...
- [Ljava.lang.String;@3e5084c9:是一个字符串数组的字节码表示
[Ljava.lang.String;@3e5084c9:是一个字符串数组的字节码表示 打印一个字符串数组的话,会发现 String[] arr = new String[10]; // String ...
- flask迁移数据库时报错:Target database is not up的解决方案
在flask中进行数据库迁移时报错,报错信息为"Target database is not up",解决方案如下 找到alembic的最新版本号,找到文件夹migrate下的最新 ...
- 【温故知新】Java web 开发(三)Form表单与上传下载文件
简介:在一和二的基础之上,这次来记录下如何在页面提交表单数据,以及文件的上传和下载整个流程,请求也不仅限于GET了,也有POST了. 1. 为了方便,在 webapp 下直接新建一个 index.ht ...
- `docker数据持久化volume和bind mounts两种方式
将数据从宿主机到容器的三种方式: ,volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)保存数据的最佳方式 ,bind mounts 将宿主机上的任 ...
- 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)
[背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...
- UML类图基础
UML( Unified Modeling Language) 统一建模语言, 它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和 ...