2017-02-15 47 views
1

请看下面的例子:使用RegEx过滤错误的输入?

string str = "January 19934"; 

结果应该是

Jan 1993 

我觉得我已经建立正确的正则表达式([A-z]{3}).*([\d]{4})在这种情况下使用,但我不知道我现在应该怎么办呢?

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

+0

显示您的实际[MCVE]请。包含正则表达式的用法。并查找“捕获组”。 –

+0

我不能编辑一个字符,但我猜19934是一个错字。 – KOB

+0

在附注中,输入来自哪里?如果它是用户输入的,它可能是1993年或1994年(或者1934年),人类是不可预测的。 – zenzelezz

回答

3

你的正则表达式中包含一个错误:[A-z] matches more than just ASCII letters。另外,.*将抓取所有字符串直到其末尾,并且回溯将迫使\d{4}匹配最后的 4位数字。您需要使用惰性量词与点,*?

然后,使用regex_search和Concat的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个位数
+0

输出不是“Jan 9934”? – KOB

+0

@KOB:*结果应该是'Jan 1993' * –

+0

而不是nongready也许最好用'\ D *'而不是'。*?' – Slava

2

这可以工作。

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

注意A-Z之后的空间是很重要的追赶空间。

+0

为什么中间的量化小组? [(A-ZA-Z] {3})[AZ] +([\ D] {4})' –

+0

你说的对@bobblebubble我可能有一些想法让它成为昨天的团体,但今天我甚至不记得我的推理,所以它的标志 - 这是个坏主意:) – Drako