C ++: ฉันควรใช้ไลบรารี regex อะไร [ปิด]


107

ฉันกำลังทำงานกับโปรเจ็กต์ C ++ เชิงพาณิชย์ (ไม่ใช่โอเพ่นซอร์ส) ที่ทำงานบนระบบที่ใช้ลินุกซ์ ฉันต้องทำ regex ภายในโค้ด C ++ (ฉันรู้ว่าตอนนี้ฉันมีปัญหา 2 อย่าง)

คำถาม: ไลบรารีใดที่ผู้ที่ใช้ regex จาก C / C ++ เป็นประจำแนะนำให้ฉันดู การค้นหาอย่างรวดเร็วทำให้ฉันสนใจสิ่งต่อไปนี้:

1) Boost.Regex (ฉันต้องไปอ่าน Boost Software License แต่คำถามนี้ไม่เกี่ยวกับลิขสิทธิ์ซอฟต์แวร์)

2) C (ไม่ใช่ C ++) POSIX regex (#include <regex.h>, regcomp, regexec ฯลฯ )

3) http://freshmeat.net/projects/cpp_regex/ (ฉันไม่รู้อะไรเกี่ยวกับอันนี้ดูเหมือนว่าจะเป็น GPL ดังนั้นจึงใช้ไม่ได้กับโปรเจ็กต์นี้)


20
ในกรณีที่ใครก็ตามกำลังดูคำถามเก่า ๆ นี้เพื่อหาคำแนะนำ ... ห้องสมุดใหม่ได้ปรากฏขึ้นเมื่อเร็ว ๆ นี้ซึ่งสมควรได้รับการกล่าวถึง: RE2 ของ Google: code.google.com/p/re2
Stéphane

2
นี่คือเสื้อคลุม c ++ สำหรับไลบรารี PCRE2 (เวอร์ชันปรับปรุงใหม่ของ PCRE)
Jahid

คำตอบ:


80

Boost.Regexดีมากและมีกำหนดให้เป็นส่วนหนึ่งของมาตรฐาน C ++ 0x (มีอยู่แล้วใน TR1)

โดยส่วนตัวแล้วฉันพบว่าBoost.Xpressiveดีกว่ามากในการทำงานด้วย เป็นไลบรารีส่วนหัวเท่านั้นและมีคุณสมบัติที่ดีบางอย่างเช่น regexes แบบคงที่ (regexes รวบรวมในเวลาคอมไพล์)

อัปเดต:หากคุณใช้คอมไพเลอร์ที่รองรับ C ++ 11 (gcc 4.8 ไม่ใช่!) ให้ใช้std :: regexเว้นแต่คุณจะมีเหตุผลที่ดีในการใช้อย่างอื่น


4
Boost เต็มไปด้วยข้อบกพร่องและดูเหมือนว่าจะไม่มีมาตรฐานการเข้ารหัสและกระบวนการ QA ไม่เหมาะสำหรับซอฟต์แวร์การผลิต ซึ่งรวมถึงเกียร์ Regex ซึ่งใช้ C (แทนที่จะเป็น C ++) ในสถานที่และมีบัฟเฟอร์ล้นเนื่องจากฟังก์ชันที่ไม่ปลอดภัยเช่น sprintf เมื่อฉันรายงานข้อบกพร่องจำนวนมากหลังจากการตรวจสอบพวกเขายังคง "ไม่ได้รับทราบ" หลายเดือนหลังจากรายงาน ใช้ด้วยความเสี่ยงของคุณเอง
jww

8
เกือบ 5 ปีต่อมาวันนี้ฉันพยายามใช้ std :: regex แต่ปรากฎว่ายังไม่มีการใช้งานใน GCC ดูstackoverflow.com/questions/15671536/…
Stéphane

2
เหตุผลที่ดีที่ไม่ใช้ std :: regex หรือ boost :: regex สำหรับเรื่องนั้นก็คือ boost :: regex ช้ากว่า re2 ประมาณ 10 เท่า
Arsen Zahray

3
@jww ไม่มี c ++ มาตรฐาน (C ++ 03 TR, C ++ 11 และ C ++ 1y) ได้ตัดสินใจที่จะรวมห้องสมุดเพิ่มหลายเป็นมาตรฐาน นั่นหมายความว่าเพื่อวัตถุประสงค์ในทางปฏิบัติทั้งหมด Boost ได้สร้างมาตรฐาน การยืนยันโดยไม่มีหลักฐานโดยใช้คำพังพอนเช่น "น่าจะ" และการใช้การโจมตีส่วนบุคคลไม่ได้ทำอะไรเพื่อเปลี่ยนแปลงความจริงที่ว่าขณะนี้การเพิ่มส่วนใหญ่เป็น C ++ และผู้คนจำนวนมากที่กำหนดทิศทางสมัยใหม่ของ C ++ ก็กำลังดำเนินการเพื่อเพิ่มประสิทธิภาพเช่นกัน
Alice

3
@Alice - คณะกรรมการ C และ C ++ สร้างมาตรฐาน พวกเขาไม่รวมไลบรารี ฉันไม่ทราบว่าพวกเขาเคยสร้างห้องสมุด
jww

22

ขอบคุณสำหรับคำแนะนำทั้งหมด.

วันนี้ฉันได้ลองทำบางสิ่งบางอย่างและด้วยสิ่งที่เรากำลังพยายามทำฉันเลือกใช้วิธีแก้ปัญหาที่ง่ายที่สุดโดยที่ฉันไม่ต้องดาวน์โหลดไลบรารีของบุคคลที่สามอื่น ๆ ในท้ายที่สุดฉัน # รวม <regex.h> และใช้ C POSIX มาตรฐานเรียก regcomp () และ regexec () ไม่ใช่ C ++ แต่ในการบีบนี้พิสูจน์แล้วว่าง่ายที่สุด


19

ในโครงการ C ++ ที่ผ่านมาฉันใช้PCREประสบความสำเร็จอย่างดี มันสมบูรณ์และผ่านการทดสอบมาเป็นอย่างดีเนื่องจากใช้ในโครงการที่มีรายละเอียดสูงจำนวนมาก และฉันเห็นว่า Google ได้สนับสนุนชุดของ C ++ Wrapper สำหรับ PCRE เมื่อเร็ว ๆ นี้ด้วย


16

C ++ มีไลบรารี regex ในตัวตั้งแต่ TR1 ไลบรารี regex ของ AFAIK Boost เข้ากันได้ดีมากและสามารถใช้ทดแทนได้หากไลบรารีมาตรฐานของคุณไม่มี TR1


คอมไพเลอร์มี TR1 อะไร? สำเนา g ++ 4.1.2 (Debian Etch) ของฉันไม่รองรับ #include <regex> แต่ขอบคุณที่นำ TR1 มาสู่ความสนใจฉันลืมไปแล้ว สำหรับคนอื่น ๆ ที่อยากรู้ข้อมูลเพิ่มเติมเกี่ยวกับ TR1 และ C ++ 0x โปรดดูที่en.wikipedia.org/wiki/Technical_Report_1
Stéphane

ในขณะที่ SP1 Visual Studio 2008 มี TR1 ส่วนใหญ่รวมถึง regex ฉันรู้ว่ามันไม่ได้ช่วยคุณใน Linux แต่คนอื่นอาจสนใจ Dinkumware ยังรองรับ TR1 บน gcc
Michael Burr

ตามที่ฉันเขียนไว้ถ้าไลบรารี std ของคุณไม่มี regex คุณสามารถใช้ boost: boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
Kasprzol

3
g ++ 4.5.0 TR1 อาศัยอยู่ใน tr1 / regex เช่น #include <tr1 / regex>
Ogre Psalm33

11

อีกสองตัวเลือก:

หากคุณสามารถเขียนในc ++ 11 - ทำแบบฝึกหัด: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

หมายเหตุ: ในขณะที่เขียนไลบรารี regex c ++ 11 เดียวที่ฉันรู้ว่าใช้งานได้คือclang / llvm oneและใช้ได้กับ Mac เท่านั้น แอฟริกายังคงไม่ใช้ regex เลย ฉันไม่รู้เกี่ยวกับ Visual Studio คนส่วนใหญ่ยังคงใช้เพิ่ม regexการดำเนินงาน


หรือคุณสามารถใช้ragelเพื่อสร้างเครื่องที่มีสถานะ จำกัด เพื่อทำการแยกวิเคราะห์ให้คุณและสร้างการติดตั้งโค้ด C / C ++: http://www.complang.org/ragel/

ฉันใช้มันเล็กน้อยเพื่อสร้างโค้ดเพื่อแยกวิเคราะห์ json ไฟล์ ragel นี้: https://github.com/matiu2/yajp/blob/master/parser/number.rl ใช้ในการสร้างรหัสนี้ https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 และแผนภาพเครื่องสถานะ จำกัด นี้:

แผนภาพสถานะ


อัปเดต 1:

libc ++ regex ของ lvm ทำงานบน ubuntu 14.04: libc ++ - dev - LLVM C ++ Standard library (ไฟล์สำหรับพัฒนา) เมื่อรวบรวม:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

อัปเดต 2:

ตอนนี้ฉันกำลังสนุกกับboost spirit 3 - ฉันชอบมันมากกว่า regex เพราะมันมีกฎสไตล์ BNF และคิดมาอย่างดี (เก่ากว่า (มีเอกสารเพิ่มเติม) พบ Spirit Qi libs ที่นี่ )




6

ฉันใช้ boost.regex เป็นการส่วนตัวมาโดยตลอด (แม้ว่าฉันจะไม่ต้องการ regex ใน C ++ มากนัก) ไมโครซอฟท์ Labs มีห้องสมุด regex เกินไปเรียกว่าเกรตา: http://research.microsoft.com/projects/greta/ เห็นได้ชัดว่ามันเร็วมากและมีไวยากรณ์ Perl 5 ทั้งหมด ฉันไม่ได้ใช้มัน แต่คุณอาจต้องการทดสอบ


8
GRETA ( research.microsoft.com/en-us/downloads/… ) สร้างโดย Eric Niebler เมื่อเขาทำงานที่ Microsoft (1998-2001 จากไฟล์ส่วนหัวของ GRETA) Eric Niebler สร้างขึ้นในปี 2550 Boost.Xpressive ผู้คนควรใช้ Boost.Xpressive เพราะใหม่กว่าและมีใบอนุญาตที่ดีกว่า "ข้อตกลงสิทธิ์การใช้งานสำหรับผู้ใช้ของ Microsoft Research"
Cristian Adam

1
ขออภัยฉันไม่เห็นว่าการดึงไลบรารี Boost เป็นสิ่งที่ดี ครั้งสุดท้ายที่ฉันตรวจสอบบูสต์เวอร์ชันที่ไม่มีการบีบอัดการดาวน์โหลดในเครื่องคือ 400 megs ไม่ต้องพูดถึงความบ้าคลั่งของเทมเพลตที่คุณได้รับจากการเพิ่ม ขออภัยฉันขอแนะนำคำตอบ Gregs
ชาด


@ ชาดเนื่องจาก boost เป็นชุดไลบรารี่มาตรฐานที่รู้จักกันดีและได้รับการยกย่องว่ามีประโยชน์ในหลาย ๆ สถานการณ์? หากขนาดการดาวน์โหลดใหญ่เกินไปสำหรับคุณให้ใช้ BCD เพื่อตัดสิ่งที่คุณไม่ต้องการ boost.regex ค่อนข้างเล็กเมื่อถูกปล้นในลักษณะนี้
Alice


1

ไม่มีใครพูดอะไรเกี่ยวกับสิ่งที่มาพร้อมกับ C ++ 0x หากคุณใช้คอมไพเลอร์และ STL ที่รองรับ C ++ 0x คุณสามารถใช้สิ่งนั้นแทนการมี lib อื่นในโปรเจ็กต์ของคุณ


1
หากคุณดูคำตอบที่ได้รับการโหวตสูงสุด (จาก 2 ปีก่อน) จะกล่าวถึงเรื่องนี้
Mateen Ulhaq
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.