题解 AT1481 【カキ】

看见大家用的都是 find 函数,枚举等 string 基本操作,这里发一个正则表达式的做法。

首先,我们要了解一下正则表达式在 c++ 中的定义以及其使用方法:

正则表达式是标准 c++11 中的一种常用与匹配两个字符串之间的数据结构,需要包含头文件 <regex>,然后就可以声明某个正则表达式:

regex name(^value$); // 其中^与$均可省略,^代表开始,$代表结束

如:
regex reg("^abc+$");

那么我们刚才定义的 abc+ 是什么意思呢?这要涉及到正则表达式的符号,这里介绍几种常用的:

1、+号

+号可以匹配其前面那个字符若干次(1\geqslant 1 \text{次}),如 sjk+ 就可以与 sjksjkksjkkk 等匹配。如果加号前面出现括号,则可以匹配括号中的内容若干次(1\geqslant 1 \text{次} )。

2、*号

*号可以匹配其前面那个字符若干次(0\geqslant 0\text{次}),与+号不同的就在于0次也可以匹配。

3、[a-z]

代表所有小写字母。

4、[A-Z]

代表所有大写字母。

5、[0-9]

代表所有阿拉伯数字。

6、?号

?号代表其前面的字符可出现也可以不出现,若前面有括号,则代表括号内内容可出现也可以不出现,如 (ak)?ioi 可以与 ioiakioi 成功匹配。

那么知道了定义方式和其基础符号,我们还要学习基本匹配函数 regex_match,这个函数可以有两或三个参数,常为两个参数,第一个参数是待匹配的字符串,第二个是一个正则表达式,返回值为布尔类型,如匹配成功返回 true,匹配失败返回 false

学习完这些,这道题目不是迎刃而解了?

代码:

#include <iostream>
#include <regex>
#include <string>
using namespace std;

int main()
{
    regex reg("^([a-z]+)?r([a-z]+)?$");
    string s; int cnt = 0;
    ios::sync_with_stdio(false);
    for(register int i = 1; i <= 12; i++)
    {
        cin >> s;
        cnt += regex_match(s, reg);
    }
    cout << cnt << endl;
    return 0;
}

这里重点说一下代码中定义的正则表达式:

因为题目说都是小写,那我们就写 [a-z],但是不只是一个字符,我们写一个 [a-z]+。但是有个问题!如果根本没有这些字符,直接出现r,那怎么办?所以我们加上 ?,并且把前面加上括号,然后写 r,后面也是同理。

但是 regex_match 匹配到 r 时不还是小写字母 [a-z] 中的一个吗?怎么跳到 r,系统早就帮你想好了,就不用担心了!

求赞

posted @   HappyBobb  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示