c++正则
本帖最后由 柿子饼同学 于 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;
} 本帖最后由 hrpzcf 于 2022-9-4 16:05 编辑
{:5_109:} #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;
}
hrpzcf 发表于 2022-9-4 15:07
#和a之间还有空格,这样试试?
嗯 , 需求是有一个 # , 前面可以空格, 后面必须有空格, 然后后面有字母 人造人 发表于 2022-9-4 15:13
谢谢 hrpzcf 发表于 2022-9-4 15:07
#和a之间还有空格,这样试试?
谢谢 柿子饼同学 发表于 2022-9-4 15:51
谢谢
我搞错正则空格符了,忽略我的回答吧{:5_92:} hrpzcf 发表于 2022-9-4 16:05
我搞错正则空格符了,忽略我的回答吧
qwq , 可是空格符难道不是 \s 嘛 柿子饼同学 发表于 2022-9-4 16:10
qwq , 可是空格符难道不是 \s 嘛
对呀,正则表达式没有问题呀
我看了这个正则表达式3遍,看不出问题,然后写了一个代码测试了一下,发现这个正则表达式没有问题
上面那个代码就是
你都不说 你输入了什么,我也没办法给你测试你的程序呀,只能是帮你验证一下这个正则表达式
人造人 发表于 2022-9-4 16:16
你都不说 你输入了什么,我也没办法给你测试你的程序呀,只能是帮你验证一下这个正则表达式
抱歉抱歉, 加上去了 , 在一楼 #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;
}
你调试一下程序,看一下在第15行getchar得到了什么
让程序一行一行的执行,观察每条语句的执行结果,看看是不是符合你预期的结果
不会调试程序怎么能行?你得学着调试程序呀
柿子饼同学 发表于 2022-9-4 16:10
qwq , 可是空格符难道不是 \s 嘛
是啊,但是我没把\s当匹配空格的符号所以我说我搞错了{:5_107:} 人造人 发表于 2022-9-4 16:38
qwq , 主要是 getline 之前一直读空 , 然后写 getchar 之后就好了 , 感觉方便一点
啊 , 我以为只要不用 printf 和 scanf 就没事呢 , 原来 getchar 也不行嘛 , 是不是因为这样会不安全
我去查了一下, cin.ignore() 第一个参数是舍弃的长度, 然后碰到 \n 就停
那为啥这里写 最大长度 呢
然后我看到不写参数也可以除换行 , 相当于 cin.ignore(1, '\n'); hrpzcf 发表于 2022-9-4 16:48
是啊,但是我没把\s当匹配空格的符号所以我说我搞错了
哦哦 柿子饼同学 发表于 2022-9-4 16:54
qwq , 主要是 getline 之前一直读空 , 然后写 getchar 之后就好了 , 感觉方便一点
啊 , 我以为只要不用...
不是不安全
stdin和cin用的不是同一套机制,你的那个 '\n'是留在了cin里面,不是stdin,你用getchar怎么能获取到cin里面的东西?
柿子饼同学 发表于 2022-9-4 16:54
qwq , 主要是 getline 之前一直读空 , 然后写 getchar 之后就好了 , 感觉方便一点
啊 , 我以为只要不用...
在所有可能的输入中,一直忽略,直到遇到 '\n' 人造人 发表于 2022-9-4 16:59
在所有可能的输入中,一直忽略,直到遇到 '\n'
就是把第一个东西后面的 换行 搞掉 , 这样就可以用 getline 了? 柿子饼同学 发表于 2022-9-4 17:00
就是把第一个东西后面的 换行 搞掉 , 这样就可以用 getline 了?
是把剩下的,在cin里面的所有字符都忽略
页:
[1]
2