C ++: Tôi nên sử dụng thư viện regex nào? [đóng cửa]


107

Tôi đang làm việc trên một dự án C ++ thương mại (không phải mã nguồn mở) chạy trên hệ thống dựa trên linux. Tôi cần thực hiện một số regex trong mã C ++. (Tôi biết: Bây giờ tôi có 2 vấn đề.)

HỎI: Những người thường xuyên làm regex từ C / C ++ khuyên tôi nên xem xét những thư viện nào? Một tìm kiếm nhanh đã khiến tôi chú ý đến những điều sau:

1) Boost.Regex (Tôi cần đọc Giấy phép Phần mềm Boost, nhưng câu hỏi này không phải về giấy phép phần mềm)

2) C (không phải C ++) POSIX regex (#include <regex.h>, regcomp, regexec, v.v.)

3) http://freshmeat.net/projects/cpp_regex/ (Tôi không biết gì về cái này; có vẻ là GPL, do đó không thể sử dụng được trong dự án này)


20
Trong trường hợp có ai đang xem câu hỏi cũ này để tìm gợi ý ... một thư viện mới đã xuất hiện gần đây đáng được đề cập: RE2 của Google: code.google.com/p/re2
Stéphane

2
Đây là trình bao bọc c ++ cho thư viện PCRE2 (phiên bản sửa đổi của PCRE) mới.
Jahid

Câu trả lời:


80

Boost.Regex rất tốt và dự kiến ​​sẽ trở thành một phần của tiêu chuẩn C ++ 0x (nó đã có trong TR1).

Cá nhân tôi thấy Boost.Xpressive tốt hơn nhiều để làm việc. Nó là một thư viện chỉ dành cho tiêu đề và nó có một số tính năng thú vị như regexes tĩnh (regexes được biên dịch tại thời điểm biên dịch).

Cập nhật: Nếu bạn đang sử dụng trình biên dịch tuân thủ C ++ 11 (gcc 4.8 KHÔNG!), Hãy sử dụng std :: regex trừ khi bạn có lý do chính đáng để sử dụng thứ khác.


4
Boost đầy lỗi và dường như thiếu tiêu chuẩn mã hóa và quy trình QA. Nó không thực sự phù hợp với phần mềm sản xuất. Điều đó bao gồm bánh răng Regex của nó, sử dụng C (thay vì C ++) ở những nơi và bao gồm lỗi tràn bộ đệm do các chức năng không an toàn như sprintf. Khi tôi báo cáo một loạt lỗi sau khi kiểm tra, chúng vẫn "không được công nhận" nhiều tháng sau báo cáo. Sử dụng có nguy cơ của riêng bạn.
jww

8
Gần 5 năm sau, hôm nay tôi đã thử sử dụng std :: regex, nhưng hóa ra nó vẫn chưa được triển khai trong GCC. Xem stackoverflow.com/questions/15671536/…
Stéphane

2
mà lý do chính đáng để không sử dụng std :: regex hoặc boost :: regex cho rằng vấn đề sẽ là boost :: regex, là khoảng chậm hơn 10 lần so với thực hiện re2
Arsen Zahray

3
@jww Không, tiêu chuẩn C ++ (C ++ 03 TR, C ++ 11 và C ++ 1y) đã quyết định kết hợp một số thư viện tăng cường vào tiêu chuẩn . Điều đó có nghĩa là, đối với tất cả các mục đích thực tế, Boost đã trở thành tiêu chuẩn. Việc đưa ra khẳng định mà không có bằng chứng bằng cách sử dụng các từ chồn như "có thể" và sử dụng các cuộc tấn công cá nhân không làm gì thay đổi được thực tế là phần lớn của boost hiện là C ++ và nhiều người xác định hướng hiện đại của C ++ cũng đang làm việc trong boost.
Alice

3
@Alice - Ủy ban C và C ++ tạo ra các tiêu chuẩn. Họ không kết hợp thư viện. Tôi không biết họ đã từng sản xuất một thư viện.
jww

22

Cảm ơn tất cả những lời đề nghị.

Tôi đã thử một vài thứ hôm nay và với những thứ chúng tôi đang cố gắng thực hiện, tôi đã chọn giải pháp đơn giản nhất mà tôi không phải tải xuống bất kỳ thư viện bên thứ 3 nào khác. Cuối cùng, tôi #include <regex.h> và sử dụng C POSIX tiêu chuẩn gọi regcomp () và regexec (). Không phải C ++, nhưng trong một thời gian ngắn, điều này được chứng minh là dễ nhất.


19

Trong các dự án C ++ trước đây, tôi đã sử dụng PCRE rất thành công. Nó rất hoàn chỉnh và được thử nghiệm tốt vì nó được sử dụng trong nhiều dự án cấu hình cao. Và tôi thấy rằng Google cũng đã đóng góp một bộ trình bao bọc C ++ cho PCRE gần đây.


16

C ++ có một thư viện regex nội trang kể từ TR1. Thư viện regex của AFAIK Boost rất tương thích với nó và có thể được sử dụng để thay thế, nếu thư viện tiêu chuẩn của bạn không cung cấp TR1.


Trình biên dịch nào có TR1? Bản sao g ++ 4.1.2 (Debian Etch) của tôi không có hỗ trợ cho #include <regex> nhưng cảm ơn bạn đã chú ý đến TR1, tôi đã quên. Đối với những người khác tò mò muốn biết thêm về TR1 và C ++ 0x, hãy xem en.wikipedia.org/wiki/Technical_Report_1
Stéphane

Kể từ SP1 Visual Studio 2008 có hầu hết TR1, bao gồm cả regex. Tôi biết nó không giúp ích gì cho bạn trên Linux, nhưng những người khác có thể quan tâm. Dinkumware cũng hỗ trợ TR1 trên gcc.
Michael Burr

Như tôi đã viết, nếu thư viện std của bạn không có regex, thì bạn có thể sử dụng boost: boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
Kasprzol

3
g ++ 4.5.0. TR1 sống trong tr1 / regex. ví dụ: #include <tr1 / regex>
Ogre Psalm33

11

Hai tùy chọn khác:

Nếu bạn có thể viết nó bằng c ++ 11 - Hãy làm theo hướng dẫn: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

Lưu ý: Tại thời điểm viết thư viện regex c ++ 11 duy nhất mà tôi biết hoạt động là thư viện clang / llvm và chỉ hoạt động trên Mac. GNU vẫn chưa triển khai regex . Tôi không biết về Visual Studio. Hầu hết mọi người vẫn sử dụng triển khai boost regex .


Hoặc bạn có thể sử dụng ragel để tạo một máy trạng thái hữu hạn để thực hiện phân tích cú pháp cho bạn và tạo triển khai mã C / C ++: http://www.complang.org/ragel/

Tôi đã sử dụng nó một chút để tạo mã để phân tích cú pháp json. Tệp ragel này: https://github.com/matiu2/yajp/blob/master/parser/number.rl được sử dụng để tạo mã này https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 và sơ đồ máy trạng thái hữu hạn này:

biểu đồ trạng thái


Cập nhật 1:

lvm's libc ++ regex hoạt động trên ubuntu 14.04: libc ++ - dev - Thư viện chuẩn LLVM C ++ (tệp phát triển). Khi biên dịch:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

Cập nhật 2:

Tôi hiện đang tận hưởng tinh thần tăng cường 3 - Tôi thích nó hơn regex, vì nó có các quy tắc kiểu BNF và được suy nghĩ kỹ càng. (Cũ hơn (có tài liệu hơn) Spirit Qi libs được tìm thấy ở đây )




6

Cá nhân tôi luôn sử dụng boost.regex (mặc dù tôi không cần nhiều regex trong C ++). Microsoft Labs cũng có một thư viện regex, được gọi là GRETA: http://research.microsoft.com/projects/greta/ . Rõ ràng nó rất nhanh và có toàn bộ cú pháp Perl 5. Tôi chưa sử dụng nó, nhưng bạn có thể muốn thử nó.


8
GRETA ( research.microsoft.com/en-us/downloads/… ) được tạo bởi Eric Niebler khi ông làm việc tại Microsoft (1998-2001 từ các tệp tiêu đề của GRETA). Eric Niebler sau đó đã tạo ra Boost.Xpressive năm 2007. Mọi người nên sử dụng Boost.Xpressive vì nó mới hơn và có giấy phép đẹp hơn "thỏa thuận cấp phép người dùng cuối Nghiên cứu Microsoft"
Cristian Adam

1
Xin lỗi, tôi không thấy việc kéo trong thư viện Boost là một điều tốt. Lần cuối cùng tôi kiểm tra phiên bản boost không nén tải xuống cục bộ là 400 megs. Chưa kể đến sự điên rồ của mẫu inain mà bạn nhận được khi tăng cường. Xin lỗi, tôi khuyên bạn nên trả lời Gregs.
Chad


@Chad Vì boost là một bộ thư viện tiêu chuẩn nổi tiếng và được coi là hữu ích trong nhiều trường hợp? Nếu kích thước tải xuống quá lớn đối với bạn, chỉ cần sử dụng BCD để tách bất kỳ thứ gì bạn không cần; boost.regex khá nhỏ khi bị loại bỏ theo cách này.
Alice


1

Không ai ở đây nói bất cứ điều gì về cái đi kèm với C ++ 0x. Nếu bạn đang sử dụng trình biên dịch và STL hỗ trợ C ++ 0x, bạn chỉ có thể sử dụng trình biên dịch đó thay vì có một lib khác trong dự án của mình.


1
Nếu bạn nhìn vào câu trả lời được bình chọn cao nhất (từ hơn 2 năm trước), nó sẽ đề cập đến điều này.
Mateen Ulhaq
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.