柿子饼同学 发表于 2022-9-4 14:52:24

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 15:07:30

本帖最后由 hrpzcf 于 2022-9-4 16:05 编辑

{:5_109:}

人造人 发表于 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;
}

柿子饼同学 发表于 2022-9-4 15:42:26

hrpzcf 发表于 2022-9-4 15:07
#和a之间还有空格,这样试试?

嗯 , 需求是有一个 # , 前面可以空格, 后面必须有空格, 然后后面有字母

柿子饼同学 发表于 2022-9-4 15:51:02

人造人 发表于 2022-9-4 15:13


谢谢

柿子饼同学 发表于 2022-9-4 15:51:33

hrpzcf 发表于 2022-9-4 15:07
#和a之间还有空格,这样试试?

谢谢

hrpzcf 发表于 2022-9-4 16:05:34

柿子饼同学 发表于 2022-9-4 15:51
谢谢

我搞错正则空格符了,忽略我的回答吧{:5_92:}

柿子饼同学 发表于 2022-9-4 16:10:14

hrpzcf 发表于 2022-9-4 16:05
我搞错正则空格符了,忽略我的回答吧

qwq , 可是空格符难道不是 \s 嘛

人造人 发表于 2022-9-4 16:14:55

柿子饼同学 发表于 2022-9-4 16:10
qwq , 可是空格符难道不是 \s 嘛

对呀,正则表达式没有问题呀
我看了这个正则表达式3遍,看不出问题,然后写了一个代码测试了一下,发现这个正则表达式没有问题
上面那个代码就是

人造人 发表于 2022-9-4 16:16:48

你都不说 你输入了什么,我也没办法给你测试你的程序呀,只能是帮你验证一下这个正则表达式

柿子饼同学 发表于 2022-9-4 16:20:18

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

抱歉抱歉, 加上去了 , 在一楼

人造人 发表于 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;
}

人造人 发表于 2022-9-4 16:41:26

你调试一下程序,看一下在第15行getchar得到了什么
让程序一行一行的执行,观察每条语句的执行结果,看看是不是符合你预期的结果
不会调试程序怎么能行?你得学着调试程序呀

hrpzcf 发表于 2022-9-4 16:48:07

柿子饼同学 发表于 2022-9-4 16:10
qwq , 可是空格符难道不是 \s 嘛

是啊,但是我没把\s当匹配空格的符号所以我说我搞错了{:5_107:}

柿子饼同学 发表于 2022-9-4 16:54:24

人造人 发表于 2022-9-4 16:38


qwq , 主要是 getline 之前一直读空 , 然后写 getchar 之后就好了 , 感觉方便一点
啊 , 我以为只要不用 printf 和 scanf 就没事呢 , 原来 getchar 也不行嘛 , 是不是因为这样会不安全
我去查了一下, cin.ignore() 第一个参数是舍弃的长度, 然后碰到 \n 就停
那为啥这里写 最大长度 呢
然后我看到不写参数也可以除换行 , 相当于 cin.ignore(1, '\n');

柿子饼同学 发表于 2022-9-4 16:55:31

hrpzcf 发表于 2022-9-4 16:48
是啊,但是我没把\s当匹配空格的符号所以我说我搞错了

哦哦

人造人 发表于 2022-9-4 16:58:09

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

不是不安全
stdin和cin用的不是同一套机制,你的那个 '\n'是留在了cin里面,不是stdin,你用getchar怎么能获取到cin里面的东西?

人造人 发表于 2022-9-4 16:59:00

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

在所有可能的输入中,一直忽略,直到遇到 '\n'

柿子饼同学 发表于 2022-9-4 17:00:18

人造人 发表于 2022-9-4 16:59
在所有可能的输入中,一直忽略,直到遇到 '\n'

就是把第一个东西后面的 换行 搞掉 , 这样就可以用 getline 了?

人造人 发表于 2022-9-4 17:03:35

柿子饼同学 发表于 2022-9-4 17:00
就是把第一个东西后面的 换行 搞掉 , 这样就可以用 getline 了?

是把剩下的,在cin里面的所有字符都忽略
页: [1] 2
查看完整版本: c++正则