2010-02-08 50 views
10

Tôi quen với Regex, nhưng bất cứ khi nào tôi cố gắng tìm bất kỳ ví dụ hoặc tài liệu nào để sử dụng regex với máy tính Unix, tôi chỉ nhận hướng dẫn về cách viết regex hoặc cách sử dụng. NET cụ thể các thư viện có sẵn cho Windows. Tôi đã tìm kiếm trong một thời gian và tôi không thể tìm thấy bất kỳ hướng dẫn tốt về C + + regex trên các máy Unix.Sử dụng cụm từ thông dụng với C++ trên Unix

Điều tôi đang cố gắng làm:

Phân tích chuỗi bằng cách sử dụng regex bằng cách chia nhỏ và sau đó đọc các nhóm con khác nhau. Để thực hiện một tương tự PHP, một cái gì đó như preg_match trả về tất cả các trận đấu $.

+0

Điều đó sẽ là 'preg_match_all (...)' sau đó, không phải 'preg_match (...)'. –

+1

Có thể vì C++ Standard không chỉ định bất kỳ lớp biểu thức chính quy nào. –

+0

Neil, nhưng sau khi tất cả php thậm chí không cung cấp tiêu chuẩn ;-) –

Trả lời

13

Cân nhắc sử dụng Boost.Regex.

Một ví dụ (từ trang web):

bool validate_card_format(const std::string& s) 
{ 
    static const boost::regex e("(\\d{4}[- ]){3}\\d{4}"); 
    return regex_match(s, e); 
} 

Một ví dụ khác:

// match any format with the regular expression: 
const boost::regex e("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z"); 
const std::string machine_format("\\1\\2\\3\\4"); 
const std::string human_format("\\1-\\2-\\3-\\4"); 

std::string machine_readable_card_number(const std::string s) 
{ 
    return regex_replace(s, e, machine_format, boost::match_default | boost::format_sed); 
} 

std::string human_readable_card_number(const std::string s) 
{ 
    return regex_replace(s, e, human_format, boost::match_default | boost::format_sed); 
} 
0

Bạn đang tìm kiếm regcomp, regexec and regfree.

Một điều cần lưu ý là biểu thức chính quy Posix thực sự triển khai hai ngôn ngữ khác nhau, thông thường (mặc định) và mở rộng (bao gồm cờ REG_EXTENDED trong lệnh gọi regcomp). Nếu bạn đến từ thế giới PHP, ngôn ngữ mở rộng gần hơn với những gì bạn đang sử dụng.

+0

cùng một bình luận như @epatel –

9

Tra cứu tài liệu cho các biểu thức TR1 hoặc (gần như tương đương) tăng cường regex. Cả hai hoạt động khá độc đáo trên các hệ thống Unix khác nhau. Các lớp regex TR1 đã được chấp nhận vào C++ 0x, vì vậy mặc dù chúng không chính xác là một phần của tiêu chuẩn, chúng sẽ sớm được hợp lý.

Chỉnh sửa: Để ngắt chuỗi thành các nhóm con, bạn có thể sử dụng sregex_token_iterator. Bạn có thể chỉ định một trong hai thứ bạn muốn so khớp làm mã thông báo hoặc những gì bạn muốn được so khớp làm dấu phân cách. Dưới đây là một bản demo quickie của cả hai:

#include <iterator> 
#include <regex> 
#include <string> 
#include <iostream> 

int main() { 

    std::string line; 

    std::cout << "Please enter some words: " << std::flush; 
    std::getline(std::cin, line); 

    std::tr1::regex r("[ .,:;\\t\\n]+"); 
    std::tr1::regex w("[A-Za-z]+"); 

    std::cout << "Matching words:\n"; 
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), w), 
     std::tr1::sregex_token_iterator(), 
     std::ostream_iterator<std::string>(std::cout, "\n")); 

    std::cout << "\nMatching separators:\n"; 
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), r, -1), 
     std::tr1::sregex_token_iterator(), 
     std::ostream_iterator<std::string>(std::cout, "\n")); 

    return 0; 
} 

Nếu bạn cung cấp cho nó đầu vào như thế này: "Đây là một số văn bản 999", kết quả là như thế này:

Matching words: 
This 
is 
some 
text 

Matching separators: 
This 
is 
some 
999 
text 
+0

Anh ấy cũng có thể sử dụng Boost Xpressive (http://www.boost.org/doc/libs/1_42_0/doc/html/xpressive.html) sẽ giúp anh ta kiểm tra lỗi thời gian biên dịch biểu thức thông thường của anh ấy. Tôi nghi ngờ rằng sẽ bao giờ trở thành tiêu chuẩn mặc dù :) – Manuel

+0

Đây là một trong những lý tưởng nhất imo. Nhưng tôi thực sự chạy vào nó trước và máy chủ mà tôi cần phải suy nghĩ để không hỗ trợ điều này. :/ –

+0

@Manuel: Cú pháp đánh dấu nhận xét đôi khi phải không? Ngoài ra bạn đang sử dụng 1,38 ?! Sử dụng '/ release /' trong URL tăng cường cho phiên bản phát hành mới nhất. –

0

Đối với biểu thức thông thường perl-tương thích (pcre/preg), tôi muốn đề xuất boost.regex.

0

Hãy thoải mái để có một cái nhìn tại công cụ màu grep nhỏ này tôi đã viết.

Tại github

Nó sử dụng regcomp, regexec và regfree rằng R Samuel Klatchko đề cập đến.

+0

Bạn có bất kỳ ví dụ về trả lại các phân nhóm và thao tác chúng không? –

+0

@Stanislav Palatnik Hãy nghĩ rằng được xử lý trên (xung quanh) dòng 95 – epatel

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