hdu 6170 正则表达式应用

题目链接: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;
}
/*

3
aa
a*
abb
a.*
abb
aab


 */



  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值