2015-09-28 4 views
1

Я пытался использовать регулярное выражение библиотеки в C++ 11 на OSX, используя лязг:C++ 11 std :: regex ошибка?

// product format 
// "AAPL 150918C00099500" 
// python regex 
// "(?P<Symbol>[a-zA-Z0-9]+)\s*(?P<Expiry>\d{6})(?P<Payoff>[C|P])(?P<Strike>\d{8})" 
#include <string> 
#include <regex> 
#include <iostream> 

int main() 
{ 
    std::string s{ "AAPL 150918C00099500" }; 
    std::regex pat{ R"([a-zA-Z0-9]{1,6})\s*(\d{6})([CP]{1})(\d{8})" }; 
    bool isMatch = std::regex_match(s, pat); 
    std::sregex_iterator it(s.begin(), s.end(), pat); 
    for(; it != std::sregex_iterator{}; ++it) 
    { 
     std::cout << (*it)[0] << std::endl; 
    } 
} 

Выход ниже код должен быть:

AAPL 
150918 
C 
00099500 

Вместо этого он выплевывает

AAPL 
150918 
C00099 
500 

Это похоже на ошибку ... Кто-нибудь знает об этом?

Благодаря

Системные детали:

$ uname -a 
Darwin MBP.fios-router.home 14.5.0 Darwin Kernel Version 14.5.0: Wed Jul 29 02:26:53 PDT 2015; root:xnu-2782.40.9~1/RELEASE_X86_64 x86_64 i386 MacBookPro11,2 Darwin 

$ g++ --version 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 7.0.0 (clang-700.0.72) 
Target: x86_64-apple-darwin14.5.0 
Thread model: posix 
+0

ли 'parseProductString' должен быть' главными '? – melpomene

ответ

4

Вы должны получить доступ к захвату групп в матче, который вы получите с regex_match функции. Доступ каждые из группы захвата с помощью числового индекса:

std::cout << (*it)[1] << "\n" << (*it)[2]<< "\n" 
           << (*it)[3] << "\n" << (*it)[4] << std::endl; 

См IDEONE demo

Кроме того, обратите внимание на сырец строкового литерала декларации регулярного выражения:

std::regex pat{ R"(([a-zA-Z0-9]{1,6})\s*(\d{6})([CP]{1})(\d{8}))" }; 
       ^^^           ^^ 
+2

Я не думаю, что вам нужен sregex_iterator, и вы можете перебирать результаты матчей. http://ideone.com/jeL4a8 может быть более идиоматичным. Но +1 за то, что выкопал меня :) – rici

+0

Большое спасибо за помощь, очень благодарен – user1357687

+0

Рад, что я мог бы помочь. Пожалуйста, подумайте о том, чтобы принять ответ, если он сработает для вас. –

Смежные вопросы