看看这个例子:
string str = "January 19934";
结果应该是
Jan 1993
我想我已经在这种情况下创建了正确的RegEx ([A-z]{3}).*([\d]{4})
,但我不知道我现在应该做什么?
如何使用RegEx提取我要查找的内容?有没有办法像接收2个变量,第一个是第一个RegEx括号的结果:([A-z]{3})
,第二个结果是第二个括号:[[\d]{4}]
?
答案 0 :(得分:3)
你的正则表达式包含一个常见错字:[A-z]
matches more than just ASCII letters。此外,.*
会抓住所有字符串直到结尾,而回溯会强制\d{4}
匹配最后 4位数。您需要使用带有点*?
。
然后,使用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之后的空格对于占用空间非常重要。