鱼C论坛

 找回密码
 立即注册
查看: 3280|回复: 20

[已解决]c++正则

[复制链接]
发表于 2022-9-4 14:52:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 柿子饼同学 于 2022-9-4 16:22 编辑

为啥这个没办法匹配下面这样的样例, * 不是 0次或多次吗
#   a

可以匹配:
# This is a title
#    This is another title
    # This is also a title
    #   You#can#add#more#sharps
# #
不能匹配:
<h1>an HTML title</h1>
#You should insert a space
## This is a secondary title
aaaaa # This is not a title at all
 # 
You should add something after the sharp sign

整体结构是 : (空格, 0个或多个) # (空格, 1个或多个) (英文字母或#) 然后后面的不做要求
#include <bits/stdc++.h>
using namespace std;

regex pattern = regex(R"(\s*#\s+.*)");
string temp;
int n, ans;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> n;
    getchar();

    while(n--){
        getline(cin, temp);
        if(regex_match(temp, pattern)) ans++;
    }

    cout << ans << endl;
    
    return 0;
}
最佳答案
2022-9-4 17:03:35
柿子饼同学 发表于 2022-9-4 17:00
就是把第一个东西后面的 换行 搞掉 , 这样就可以用 getline 了?

是把剩下的,在cin里面的所有字符都忽略
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-4 15:07:30 | 显示全部楼层
本帖最后由 hrpzcf 于 2022-9-4 16:05 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-4 15:13:34 | 显示全部楼层
#include <iostream>
#include <string>
#include <regex>

using std::cin, std::cout, std::endl;
using std::string;
using std::regex, std::regex_match;
using std::getline;

int main() {
    regex pattern(R"(\s*#\s+.*)");
    string str; getline(cin, str);
    if(regex_match(str, pattern)) cout << "match" << endl;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-4 15:42:26 | 显示全部楼层
hrpzcf 发表于 2022-9-4 15:07
#和a之间还有空格,这样试试?

嗯 , 需求是有一个 # , 前面可以空格, 后面必须有空格, 然后后面有字母
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-4 15:51:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-4 15:51:33 | 显示全部楼层
hrpzcf 发表于 2022-9-4 15:07
#和a之间还有空格,这样试试?

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 16:05:34 | 显示全部楼层

我搞错正则空格符了,忽略我的回答吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-4 16:10:14 | 显示全部楼层
hrpzcf 发表于 2022-9-4 16:05
我搞错正则空格符了,忽略我的回答吧

qwq , 可是空格符难道不是 \s 嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 16:14:55 | 显示全部楼层
柿子饼同学 发表于 2022-9-4 16:10
qwq , 可是空格符难道不是 \s 嘛

对呀,正则表达式没有问题呀
我看了这个正则表达式3遍,看不出问题,然后写了一个代码测试了一下,发现这个正则表达式没有问题
上面那个代码就是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 16:16:48 | 显示全部楼层
你都不说 你输入了什么,我也没办法给你测试你的程序呀,只能是帮你验证一下这个正则表达式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-4 16:20:18 | 显示全部楼层
人造人 发表于 2022-9-4 16:16
你都不说 你输入了什么,我也没办法给你测试你的程序呀,只能是帮你验证一下这个正则表达式

抱歉抱歉, 加上去了 , 在一楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 16:38:21 | 显示全部楼层
#include <bits/stdc++.h>

using namespace std;

regex pattern = regex(R"(\s*#\s+.*)");
string temp;
int n, ans;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n;
    //getchar();    // 你上面不是把cin和stdin解除绑定了么?
                    // 怎么一会用cin一会用stdin呢?都解除绑定了,还可以混用这两个吗?
                    // 你调试程序么,第15行在做什么?
                    // 把cin读取剩下的那个'\n'丢弃对吧,你15行下断点看一下getchar得到了什么
                    // 让程序一行一行的往下执行,观察语句的执行结果,发现了不符合你预期的结果,那就是这里有问题了
    cin.ignore(numeric_limits<streamsize>::max(), '\n');    // 上一个帖子不是告诉你要这样用么,给你写的代码你都不看,伤心。
    while(n--) {
        getline(cin, temp);
        if(regex_match(temp, pattern))
            ans++;
    }

    cout << ans << endl;

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 16:41:26 | 显示全部楼层
你调试一下程序,看一下在第15行getchar得到了什么
让程序一行一行的执行,观察每条语句的执行结果,看看是不是符合你预期的结果
不会调试程序怎么能行?你得学着调试程序呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 16:48:07 | 显示全部楼层
柿子饼同学 发表于 2022-9-4 16:10
qwq , 可是空格符难道不是 \s 嘛

是啊,但是我没把\s当匹配空格的符号所以我说我搞错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-4 16:54:24 | 显示全部楼层

qwq , 主要是 getline 之前一直读空 , 然后写 getchar 之后就好了 , 感觉方便一点
啊 , 我以为只要不用 printf 和 scanf 就没事呢 , 原来 getchar 也不行嘛 , 是不是因为这样会不安全
我去查了一下, cin.ignore() 第一个参数是舍弃的长度, 然后碰到 \n 就停
那为啥这里写 最大长度 呢
然后我看到不写参数也可以除换行 , 相当于 cin.ignore(1, '\n');
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-4 16:55:31 | 显示全部楼层
hrpzcf 发表于 2022-9-4 16:48
是啊,但是我没把\s当匹配空格的符号所以我说我搞错了

哦哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 16:58:09 | 显示全部楼层
柿子饼同学 发表于 2022-9-4 16:54
qwq , 主要是 getline 之前一直读空 , 然后写 getchar 之后就好了 , 感觉方便一点
啊 , 我以为只要不用  ...

不是不安全
stdin和cin用的不是同一套机制,你的那个 '\n'是留在了cin里面,不是stdin,你用getchar怎么能获取到cin里面的东西?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 16:59:00 | 显示全部楼层
柿子饼同学 发表于 2022-9-4 16:54
qwq , 主要是 getline 之前一直读空 , 然后写 getchar 之后就好了 , 感觉方便一点
啊 , 我以为只要不用  ...

在所有可能的输入中,一直忽略,直到遇到 '\n'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-4 17:00:18 | 显示全部楼层
人造人 发表于 2022-9-4 16:59
在所有可能的输入中,一直忽略,直到遇到 '\n'

就是把第一个东西后面的 换行 搞掉 , 这样就可以用 getline 了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 17:03:35 | 显示全部楼层    本楼为最佳答案   
柿子饼同学 发表于 2022-9-4 17:00
就是把第一个东西后面的 换行 搞掉 , 这样就可以用 getline 了?

是把剩下的,在cin里面的所有字符都忽略
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 00:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表