使用RegEx过滤错误的输入?

时间:2017-02-15 16:11:24

标签: c++ regex

看看这个例子:

string str = "January 19934";

结果应该是

Jan 1993

我想我已经在这种情况下创建了正确的RegEx ([A-z]{3}).*([\d]{4}),但我不知道我现在应该做什么?

如何使用RegEx提取我要查找的内容?有没有办法像接收2个变量,第一个是第一个RegEx括号的结果:([A-z]{3}),第二个结果是第二个括号:[[\d]{4}]

2 个答案:

答案 0 :(得分:3)

你的正则表达式包含一个常见错字:[A-z] matches more than just ASCII letters。此外,.*会抓住所有字符串直到结尾,而回溯会强制\d{4}匹配最后 4位数。您需要使用带有点*?

lazy 量词

然后,使用regex_search并连接2组值:

#include <regex>
#include <string>
#include <iostream>
using namespace std;

int main() {
    regex r("([A-Za-z]{3}).*?([0-9]{4})");
    string s("January 19934");
    smatch match;
    std::stringstream res("");
    if (regex_search(s, match, r)) {
        res << match.str(1) << " " << match.str(2);
    }
    cout << res.str();  // => Jan 1993
    return 0;
}

请参阅C++ demo

模式说明

  • ([A-Za-z]{3}) - 第1组:三个ASCII字母
  • .*? - 除了换行符号以外的任何0 +字符
  • ([0-9]{4}) - 第2组:4位

答案 1 :(得分:2)

这可行。

([A-Za-z]{3})([a-z ])+([\d]{4})

请注意a-z之后的空格对于占用空间非常重要。