请看下面的例子:使用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