2011-09-05 38 views
10

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

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

回答

16

使用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 ... 
} 
+0

也许我的正则表达式是错误的,但这并不能给我带来正确的结果。 – John

+0

是正则表达式,谢谢。 – John

13
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 

升压使用括号的子匹配,并且所述第一子匹配总是充分匹配的字符串。 regex_match必须匹配模式的整个输入行,如果您尝试匹配子字符串,请改为使用regex_search。

我上面使用的示例使用了posix扩展正则表达式语法,它使用boost :: regex :: extended参数指定。忽略该参数会更改语法以使用perl样式正则表达式语法。其他正则表达式语法可用。

相关问题