2011-01-30 16 views
7

Tôi đang gặp sự cố với chức năng định dạng trong boost::regex_replace. Tôi có thể gọi cho phiên bản một tham số của nó, nhưng không phải là hai tham số:Sự cố với hai chức năng định dạng tham số trong tăng :: regex_replace

e = "(^|>)([^<>]+)"; 
h_str = regex_replace(h_str, e, repl_quot, boost::match_default); 

đâu repl_quot được định nghĩa là

std::string const &repl_quot(boost::smatch const &what) { 
    boost::regex e("\""); 
    std::string repl("&#34;"); 
    static std::string; 
    str = regex_replace(what[0].str(), e, repl, boost::match_default); 
    return str; 
} 

Các công trình trên, nhưng tôi không thực sự muốn sử dụng tĩnh biến, vì vậy tôi đã thử những gì tôi nghĩ là một phiên bản thay thế tham số có thể chấp nhận được:

std::string const &repl_quot2(boost::smatch const &what, std::string &out) { 
    boost::regex e("\""); 
    std::string repl("&#34;"); 
    out = regex_replace(what[0].str(), e, repl, boost::match_default); 
    return out; 
} 

Nhưng regex_replace sẽ không chấp nhận điều này (lỗi trình biên dịch phức tạp). Tôi cố gắng để sử dụng phiên bản hai tham số dựa trên sau từ tài liệu Boost::Regex:

mẫu basic_string regex_replace (const basic_string & s, const basic_regex & đ Formatter fmt, cờ match_flag_type = match_default);

Yêu cầu Các loại Formatter phải hoặc ... một functor unary, nhị phân hoặc ternary rằng tính chuỗi thay thế từ một cuộc gọi chức năng: hoặc fmt (gì) mà phải trả lại một container của char_type của được được sử dụng làm văn bản thay thế hoặc hoặc fmt (cái gì, ra) hoặc fmt (cái gì, , cờ), cả hai đều viết văn bản thay thế thành * out, và sau đó trả lại vị trí OutputIterator mới. Trong mỗi trường hợp, đối tượng match_results đại diện cho kết quả phù hợp.

Đã có lặp đi lặp lại yêu cầu được thông báo biên dịch lỗi, vì vậy ở đây nó là (hãy cẩn thận những gì bạn yêu cầu):

c: \ tăng \ tăng \ regex \ v4 \ regex_format.hpp Trong hàm thành viên `OutputIter boost :: re_detail :: format_functor_container :: operator() (const Match &, OutputIter, boost :: regex_constants :: match_flag_type, const Traits &) [với OutputIter = boost :: re_detail :: string_out_iterator, std: : allocator>>, Container = const std :: chuỗi & (*) (const boost :: smatch &, std :: string &), Đối sánh = boost :: match_results < __gnu_cxx :: __ normal_iterator, std :: allocator>>, std :: allocator, std :: allocator>>>>>, Traits = boost :: regex_traits_wrapper>>] ':

356 c : \ boost \ boost \ regex \ v4 \ match_results.hpp khởi tạo từ `OutputIterator boost :: match_results :: format (OutputIterator, Functor, boost :: regex_constants :: match_flag_type, const RegexT &) const [với OutputIterator = boost :: re_detail :: string_out_iterator, std :: allocator>>, Functor = const std :: string & (*) (const boost :: smatch &, std :: string &), RegexT = boost :: basic_regex>>, BidiIterator = __gnu_cxx :: __ normal_iterator, std :: allocator>>, Allocator = std :: allocator, std :: allocator>>>>] '

60 c: \ boost \ boost \ regex \ v4 \ regex_replace.hpp khởi tạo từ `OutputIterator boost :: regex_replace (OutputIterator, BidirectionalIterator, BidirectionalIterator, const boost :: basic_regex &, Formatter, boost :: regex_constants :: match_flag_type) [với OutputIter ator = boost :: re_detail :: string_out_iterator, std :: allocator>>, BidirectionalIterator = __gnu_cxx :: __ normal_iterator, std :: allocator>>, traits = boost :: regex_traits>, charT = char, Formatter = const std :: chuỗi & (*) (tăng const :: smatch &, std :: string &)]

80 c: \ tăng \ tăng \ regex \ v4 \ regex_replace.hpp instantiated từ `std :: basic_string, std :: phân bổ < _T2>> tăng :: regex_replace (const std :: basic_string, std :: allocator < _T2>> &, const boost :: basic_regex &, định dạng, tăng :: regex_constants :: match_flag_type) [với đặc điểm = boost :: regex_traits>, charT = char, Formatter = const std :: chuỗi & (*) (const boost :: smatch &, std :: string &)]

327 C: \ Dev-Cpp \ ví dụ \ wordrad \ xhtml_open.cpp instantiated từ đây

1064 c: \ tăng \ tăng \ regex \ v4 \ regex_format. hpp yêu cầu cho thành viên begin' in ((tăng :: re_detail :: format_functor_container, std :: allocator>>, std :: allocator, std :: allocator>>>>>, boost :: regex_traits_wrapper>>> *) này) -> boost :: re_detail :: format_functor_container, std :: allocator>>, std :: allocator, std :: allocator>>>>>, boost :: regex_traits_wrapper>>> :: func ', là kiểu non-class ` const std :: string & (* const) (const boost :: smatch &, std :: string &) '

1064 c: \ boost \ boost \ regex \ v4 \ regex_format.hpp yêu cầu cho thành viên end' in ((tăng :: re_detail :: format_functor_container, std :: allocator>>, std :: allocator, std :: allocator> >>>>, boost :: regex_traits_wrapper>>> *) this) -> boost :: re_detail :: format_functor_container, std :: allocator>>, std :: allocator, std :: allocator>>>>>, tăng: : regex_traits_wrapper>>> :: func 'mà là loại phi lớp' std :: string const & (* const) (const boost :: smatch &, std :: string &)'

+0

Bạn nên đăng lỗi mà bạn đang gặp phải. –

+0

Dài ngớ ngẩn của nó. Tôi dự đoán bạn sẽ không làm cho đầu hoặc đuôi của nó. Mẫu của nó có liên quan hoặc một cái gì đó. Vấn đề là với những gì regex-replace được mong đợi như là một chữ ký cho tham số fmt, petaining cho các mẫu hoặc bất cứ điều gì. Thông báo lỗi là không thể giải mã được. – Mark

+0

1064 c: \ boost \ boost \ regex \ v4 \ regex_format.hpp yêu cầu cho thành viên 'end 'trong' ((boost :: re_detail :: format_functor_container , std :: allocator >>, std :: allocator , std :: allocator >>>>>, boost :: regex_traits_wrapper >>> *) này) -> boost :: re_detail :: format_fu ... – Mark

Trả lời

1

OK đây là cách tôi phải viết repl_quot2:

struct formatter 
{  
    template<typename Out> 
    Out operator()(boost::smatch const &what, Out out) const { 
    boost::regex e("\"");  
    std::string repl("&#34;"); 
    std::string str 
     = regex_replace(what[0].str(), e, repl, boost::match_default); 
    out = std::copy(str.begin(), str.end(), out); 
    return out; 
    } 

}; 

Và sau đó khi gọi nó từ regex_replace:

e = "(^|>)[^<>]+"; 
    formatter repl_quot2; 
    h_str = regex_replace(h_str, e, repl_quot2, boost::match_default); 

này tương ứng với tài liệu tại http://boost-sandbox.sourceforge.net/libs/xpressive/doc/html/boost_xpressive/user_s_guide/string_substitutions.html. Câu hỏi của tôi vào lúc này là nó yêu cầu một functor (một lớp với toán tử() ngược lại với một hàm nếu phiên bản hai tham số được gọi, nhưng không yêu cầu một hàm functor cho một phiên bản tham số (repl_quot trong OP). Dù sao, vẫn chưa nhận được phiên bản hai parm mới để làm việc như một chức năng thẳng.Nhưng vấn đề chính là out mà tôi đã phải vượt qua và trở lại như là một tham số mẫu như được hiển thị, như trái ngược với làm cho nó std :: string như trong OP. Nó được cho là một OutputIterator -still không biết đó là thực sự.

Ngẫu nhiên, tất cả regex này làm là thay thế dấu nháy kép bằng phiên bản thực thể html, \ & # 34; trong bất kỳ văn bản nào trong html không phải là một phần của thẻ.

Ngoài ra, lý do tôi muốn thay thế hàm ban đầu của mình là repl_quot là tôi phải lưu trữ giá trị trả về trong một biến cục bộ tĩnh trong repl_quot. Nó không hoạt động để chỉ trả về một biến cục bộ bình thường, bởi vì nó có thể được deallocated trước khi nó thậm chí có thể được sử dụng (và gây ra sự cố). repl_quot đã được làm việc - vấn đề của tôi với tĩnh là nó không phải là thread an toàn, và không biết nếu Boost :: RegEx là đa luồng. Tôi nghĩ rằng tôi biên dịch nó như đa luồng, nhưng var tĩnh dường như không gây ra vấn đề. Nhưng với repl_quot2 tôi viết giá trị trả về cho tham số đầu ra.

Các vấn đề liên quan