請看下面的例子:使用RegEx過濾錯誤的輸入?
string str = "January 19934";
結果應該是
Jan 1993
我覺得我已經建立正確的正則表達式([A-z]{3}).*([\d]{4})
在這種情況下使用,但我不知道我現在應該怎麼辦呢?
如何使用RegEx提取我在找的東西?有沒有像接收2個變量的方法,第一個是第一個RegEx括號的結果:([A-z]{3})
,第二個結果是第二個括號:[[\d]{4}]
?
請看下面的例子:使用RegEx過濾錯誤的輸入?
string str = "January 19934";
結果應該是
Jan 1993
我覺得我已經建立正確的正則表達式([A-z]{3}).*([\d]{4})
在這種情況下使用,但我不知道我現在應該怎麼辦呢?
如何使用RegEx提取我在找的東西?有沒有像接收2個變量的方法,第一個是第一個RegEx括號的結果:([A-z]{3})
,第二個結果是第二個括號:[[\d]{4}]
?
你的正則表達式中包含一個錯誤:[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;
}
模式闡釋:
([A-Za-z]{3})
- 第1組:三個ASCII字母.*?
- 任何0+比儘可能少([0-9]{4})
斷行符號等字符 - 組2:4個位數這可以工作。
([A-Za-z]{3})([a-z ])+([\d]{4})
注意A-Z之後的空間是很重要的追趕空間。
爲什麼中間的量化小組? [(A-ZA-Z] {3})[AZ] +([\ D] {4})' –
你說的對@bobblebubble我可能有一些想法讓它成爲昨天的團體,但今天我甚至不記得我的推理,所以它的標誌 - 這是個壞主意:) – Drako
顯示您的實際[MCVE]請。包含正則表達式的用法。並查找「捕獲組」。 –
我不能編輯一個字符,但我猜19934是一個錯字。 – KOB
在附註中,輸入來自哪裏?如果它是用戶輸入的,它可能是1993年或1994年(或者1934年),人類是不可預測的。 – zenzelezz