2015-01-04 60 views
1

我想從文檔中提取關鍵短語:「something KEY phrase END something ... ect」。我的規則運作良好,但結果不包含關鍵名稱。爲了得到一個字符串應該是什麼規則:「KEY短語」。謝謝你的建議。規則從文本文檔中提取鍵+短語

std::vector<std::string> doc; 
bool r = qi::phrase_parse(first,last, 
    (qi::omit[*(qi::char_-"KEY")] 
    >> qi::lexeme[ "KEY" 
    >> *(qi::char_-"KEY" -"END")]) % "END" 
, qi::space, doc); 
+0

「doc」的類型是什麼? – sehe

+0

(另外,你忘了告訴我們'doc'的類型) – sehe

回答

1

qi::lit(...)不合成屬性。

qi::string(...)確實。

用qi :: string(「KEY」)替換"KEY",可能。 (很難說在不知道的doc類型)

bool r = qi::phrase_parse(first,last, 
    (qi::omit[*(qi::char_-"KEY")] 
    >> qi::lexeme[ qi::string("KEY") 
    >> *(qi::char_-"KEY" -"END")]) % "END" 
, qi::space, doc); 

BONUSseek[] parser directive從精神資源庫參見:

seek[]解析器指令跳過所有輸入,直至主題解析器比賽。

這裏就是我想要做的:

Live On Coliru

#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/repository/include/qi_seek.hpp> 
namespace qi = boost::spirit::qi; 
namespace qr = boost::spirit::repository::qi; 

extern std::string const sample; // below 

int main() { 
    auto f(sample.begin()), l(sample.end()); 

    std::vector<std::string> phrases; 

    if (qi::parse(f,l, *qi::as_string[ 
       qr::seek[qi::string("KEY")] >> *(qi::char_ - "END") 
      ], phrases)) 
    { 
     for (size_t i = 0; i < phrases.size(); ++i) 
      std::cout << "keyphrase #" << i << ": '" << phrases[i] << "'\n"; 
    } 
} 

打印:包括在這個答案評論

keyphrase #0: '[email protected]/[email protected]' 
keyphrase #1: '[email protected]@' 
keyphrase #2: '[email protected][email protected]' 
keyphrase #3: '[email protected]@' 
keyphrase #4: '[email protected]@' 
keyphrase #5: '[email protected]+oXZQF9X/[email protected]' 

的樣本數據:/這裏/

+0

謝謝。這已經完成,但仍然是一樣的。 – stansy

+0

@stansy我已經包含了一個基於'repository :: qi :: seek'的示例, – sehe

+0

明智的解決方案。非常感謝。 – stansy

0

最終基準:

  • 靈奇(以上sahe的解決方案) - 項目數:5585已用時間:183.676秒
  • 升壓正則表達式 - 項目數:5585已用時間:197.684秒
  • xpressive中的regex - 項目數:5585已用時間:232.597秒

數據大小:23.9 MB文本文件