繁体   English   中英

在 c++ 中使用 boost 正则表达式提取子匹配

[英]Extracting submatches using boost regex in c++

我正在尝试使用 boost 正则表达式从文本文件中提取子匹配项。 目前我只返回第一个有效行和完整行,而不是有效的 email 地址。 我尝试使用迭代器和子匹配,但没有成功。 这是当前代码:

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(); 
}

使用boost :: smatch

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 ...
}
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扩展正则表达式语法,该语法使用boost :: regex :: extended参数指定。 省略该参数会更改语法以使用perl样式的regex语法。 其他正则表达式语法可用。

这一行:

string submatch(result[1].first, result[1].second);

导致visual c ++中的错误(我在2012年测试过,但是也期望早期版本也这样做)

请参阅https://groups.google.com/forum/?fromgroups#!topic/cpp-netlib/0Szv2WcgAtc进行分析。

boost::sub_match转换为std::string的最简单方法:

boost::smatch result;
// regex_search or regex_match ...
string s = result[1];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM