gpt4 book ai didi

c++ - 不需要的正则表达式捕获

转载 作者:行者123 更新时间:2023-11-28 05:47:05 25 4
gpt4 key购买 nike

以下正则表达式应该匹配夹在两个非字母数字字符之间的 YYYY-MM-DD 形式的日期。它应该只提取日期而不是两个非字母字符......但它恰恰相反。我究竟做错了什么。PS 我已经尝试在非捕获组 (?:) 中围绕 [^:alnum:] 但它没有用。

regex exp1("[^:alnum:]([1-9][0-9]{3}(?:-[0-9][1-9]){2})[^:alnum:]")
//or
regex exp1("[^a-zA-Z0-9]([1-9][0-9]{3}(?:-[0-9][1-9]){2})[^a-zA-Z0-9]")

您也可以访问此网站来试用我的正则表达式,而无需为其编写 C+ 代码。如果您选择使用该网站,请复制并粘贴非 POSIX 括号表达式(不带引号):

regex online tester

#include <regex>
#include <string>
#include <iostream>
#include <vector>

#define isthirty(x) for (int i = 0; i < 3; i++) {if (days[i] == x[1]) {thirty = true;break;}}
using namespace std;

int main() {
vector<string> words;
string str;
getline(cin, str);
int N = stoi(str);
int days[] = { 4,6,9,11 };
regex exp1("[^a-zA-Z0-9]([1-9][0-9]{3}(?:-[0-9][1-9]){2})[^a-zA-Z0-9]");
for (int i = 0; i < N; i++) {
getline(cin, str);
sregex_iterator it(str.cbegin(), str.cend(), exp1);
sregex_iterator end;
for (; it != end; it++) {
words.push_back(it->str(0));
}
}

regex exp2("([0-9])+");
for (auto &it : words) {
int dates[3] = {};
sregex_iterator pos(it.cbegin(), it.cend(), exp2);
sregex_iterator end;
str = it.substr(1,10);
for (int i = 0; pos != end; pos++, i++) {
dates[i] = stoi(pos->str(0));
}
if (dates[0] > 2016 || dates[1] > 12 || dates[2] > 31) {
continue;
}
bool thirty = false;
isthirty(dates);
if (thirty && dates[2] <= 30) {
cout << str << "\n";
}
else if(dates[1] == 2) {
if (dates[0] % 4 == 0 && dates[2] <= 29) {
cout << str << "\n";
}
else if (dates[0] % 4 != 0 && dates[2] <= 28) {
cout << str << "\n";
}
}
else if (dates[2] <= 31) {
cout << str << "\n";
}
}
return 0;
}

最佳答案

尝试更简单的正则表达式:

[^0-9]([0-9]{4}-[0-9]{2}-[0-9]{2})[^0-9]

它查找非数字,然后是 YYYY-MM-DD 日期,然后是非数字。它捕获日期。适用于几乎所有正则表达式风格。

关于c++ - 不需要的正则表达式捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36015356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com