我在c ++中有一个函数,它接受一个表示格式为MM / DD / YYYY的日期的输入字符串。由于环境的限制,该函数使用正则表达式的C实现。我试图从字符串中提取年份,月份和日期。
#include <stdarg.h>
#include <string.h>
#include <iostream>
#include <regex.h>
#include <sys/types.h>
using namespace std;
void convertDate(string input)
{
char pattern[100];
regex_t preg[1];
regmatch_t match[100];
const char * reg_data = input.c_str();
string year;
string month;
string day;
strcpy(pattern, "^([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})$");
int rc = regcomp(preg, pattern, REG_EXTENDED);
rc=regexec(preg, reg_data, 100, match, 0);
if( rc != REG_NOMATCH )
{
year = input.substr(match[3].rm_so, match[3].rm_eo);
month = input.substr(match[1].rm_so, match[1].rm_eo);
day = input.substr(match[2].rm_so, match[2].rm_eo);
cout << year << endl;
cout << month << endl;
cout << day << endl;
}
}
以下是输入/输出的一些示例:
1) string input2 = "8/11/2014";
convertDate(input2);
2014
8
11/2
2) string input2 = "11/8/2014";
convertDate(input2);
2014
11
8/20
3) string input2 = "1/1/2014";
convertDate(input2);
2014
1
1/2
我不确定为什么这一天捕获长度为4的正则表达式组,当捕获组声明它应该只捕获1或2个数字字符时。此外,当月份正确时,为什么会有这个问题呢?它们看起来像是使用相同的逻辑。
我使用了文档here
答案 0 :(得分:2)
您错误地使用了.substr
method。 substr
的第二个参数应该是子字符串的长度,但是你给它的结束索引。试试这个:
day = input.substr(match[2].rm_so, match[2].rm_eo - match[2].rm_so);