我正在尝试使用boost regex从文本文件中提取子匹配。目前我只返回第一个有效行和整行,而不是有效的电子邮件地址。我尝试使用迭代器并使用子匹配但我没有成功。这是当前的代码:
if(Myfile.is_open()) {
boost::regex pattern("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$");
while(getline(Myfile, line)) {
string::const_iterator start = line.begin();
string::const_iterator end = line.end();
boost::sregex_token_iterator i(start, end, pattern);
boost::sregex_token_iterator j;
while ( i != j) {
cout << *i++ << endl;
}
Myfile.close();
}
答案 0 :(得分:19)
boost::regex pattern("what(ever) ...");
boost::smatch result;
if (boost::regex_search(s, result, pattern)) {
string submatch(result[1].first, result[1].second);
// Do whatever ...
}
答案 1 :(得分:16)
const string pattern = "(abc)(def)";
const string target = "abcdef";
boost::regex regexPattern(pattern, boost::regex::extended);
boost::smatch what;
bool isMatchFound = boost::regex_match(target, what, regexPattern);
if (isMatchFound)
{
for (unsigned int i=0; i < what.size(); i++)
{
cout << "WHAT " << i << " " << what[i] << endl;
}
}
输出如下
WHAT 0 abcdef
WHAT 1 abc
WHAT 2 def
Boost使用带括号的子匹配,第一个子匹配始终是完全匹配的字符串。 regex_match必须匹配模式的整个输入行,如果您尝试匹配子字符串,请使用regex_search。
我上面使用的示例使用posix扩展的regex语法,该语法使用boost :: regex :: extended参数指定。省略该参数会更改语法以使用perl样式的regex语法。其他正则表达式语法可用。
答案 2 :(得分:0)
这一行:
string submatch(result[1].first, result[1].second);
导致visual c ++中的错误(我在2012年测试过,但是也期望早期版本也这样做)
请参阅https://groups.google.com/forum/?fromgroups#!topic/cpp-netlib/0Szv2WcgAtc进行分析。