2017-02-15 74 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