hdu 6170 正则表达式应用

来源:互联网 发布:淘宝好听的用户名大全 编辑:程序博客网 时间:2024/05/16 14:03

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170

正则表达式在C++11以上支持

其实题目里所说的匹配就是正则表达式的匹配,首先看几个正则表达式的内容:

\num
匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
( )将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
.点
匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。
那么 对于匹配的内容中正常单独的 . 和 * 都是直接使用正则表达式匹配,但是遇到了.*的时候,按照题目意图,我们将其替换成 (.)\X    ,其中()表示组,里面放一个. 其中.就是匹配任意字符,但是题目说是可以匹配多个 那么就是可以匹配形如:  <p>xxxx</p> 的东西,后面数字表示组数,组数必须不同,因为前面的.匹配到的是不同的。*还是正常的匹配。


头文件:#include<regex>

#include <iostream>#include<regex>#include<cstring>using namespace std;int N,m,n,t;char a[10111],b[11111],c[10111];int main() {    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%s",a+1);        scanf("%s",b+1);        int la=strlen(a+1);        int lb=strlen(b+1);a[0]=b[0]=c[0]='#';        int lc=1;        int cc=1;        for(int t=1;t<=lb;t++)        {            if(b[t] == '*' && b[t-1] =='.')            {                lc+=sprintf(c+lc-1,"(.)\\%d*",cc++)-1;            }            else c[lc++] = b[t];        }        c[lc]=0;       // cout<<a<<endl;       // cout<<b<<endl;       // cout<<c<<endl;        if(regex_match(a,regex(c)))            printf("yes\n");        else printf("no\n");    }        return 0;}/*3aaa*abba.*abbaab */



原创粉丝点击