鱼C论坛

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

[已解决]c++正则

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

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

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

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

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

可以匹配:
  1. # This is a title
  2. #    This is another title
  3.     # This is also a title
  4.     #   You#can#add#more#sharps
  5. # #
复制代码

不能匹配:
  1. <h1>an HTML title</h1>
  2. #You should insert a space
  3. ## This is a secondary title
  4. aaaaa # This is not a title at all
  5. #
  6. You should add something after the sharp sign
复制代码


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

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

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

  9.     cin >> n;
  10.     getchar();

  11.     while(n--){
  12.         getline(cin, temp);
  13.         if(regex_match(temp, pattern)) ans++;
  14.     }

  15.     cout << ans << endl;
  16.    
  17.     return 0;
  18. }
复制代码
最佳答案
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 | 显示全部楼层
  1. #include <iostream>
  2. #include <string>
  3. #include <regex>

  4. using std::cin, std::cout, std::endl;
  5. using std::string;
  6. using std::regex, std::regex_match;
  7. using std::getline;

  8. int main() {
  9.     regex pattern(R"(\s*#\s+.*)");
  10.     string str; getline(cin, str);
  11.     if(regex_match(str, pattern)) cout << "match" << endl;
  12.     return 0;
  13. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. #include <bits/stdc++.h>

  2. using namespace std;

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

  6. int main() {
  7.     ios::sync_with_stdio(0);
  8.     cin.tie(0);
  9.     cout.tie(0);

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

  22.     cout << ans << endl;

  23.     return 0;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-5-4 00:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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