อ่าน 3 นาที
RE2 (ซอฟต์แวร์)
RE2เป็นไลบรารีซอฟต์แวร์C++ ซึ่งใช้งานเอ็นจิ้นนิพจน์ปกติโดยใช้เครื่องสถานะจำกัดซึ่งแตกต่างจากไลบรารีนิพจน์ปกติ อื่นๆ ส่วนใหญ่ RE2 ต้องการ C++ เวอร์ชันขั้นต่ำC++17และใช้ไลบรารี...
RE2 (ซอฟต์แวร์)
| RE2 | |
|---|---|
| ผู้เขียนต้นฉบับ | |
| ปล่อย | 11 มีนาคม 2553 [ 1 ] |
| เวอร์ชันเสถียร | |
| เขียนเป็น | ซี++ |
| ระบบปฏิบัติการ | ข้ามแพลตฟอร์ม |
| พิมพ์ | ไลบรารีนิพจน์ปกติ |
| ใบอนุญาต | บีเอสดี |
| เว็บไซต์ | github.com/google/re2 |
| ที่เก็บข้อมูล | github.com/google/re2 |
RE2เป็นไลบรารีซอฟต์แวร์C++ [ 3 ]ซึ่งใช้งานเอ็นจิ้นนิพจน์ปกติ[ 3 ]โดยใช้เครื่องสถานะจำกัดซึ่งแตกต่างจากไลบรารีนิพจน์ปกติ อื่นๆ ส่วนใหญ่ RE2 ต้องการ C++ เวอร์ชันขั้นต่ำC++17และใช้ไลบรารี Abseilของ Google
RE2 ถูกนำไปใช้โดยGoogleและ Google ใช้ RE2 สำหรับผลิตภัณฑ์ของ Google [ 4 ] RE2 ใช้อัลกอริ ทึมอัตโนมัติสถานะจำกัดแบบกำหนดได้ "แบบเรียลไทม์" โดย อิงจาก Plan 9 grepของKen Thompson [ 5 ]มันถูกออกแบบมาเพื่อหลีกเลี่ยง การโจมตี ReDoS (การโจมตีปฏิเสธการให้บริการด้วย regex)
การเปรียบเทียบกับ PCRE
RE2 ทำงานได้เทียบเท่ากับนิพจน์ปกติที่เข้ากันได้กับ Perl (PCRE) สำหรับตัวดำเนินการนิพจน์ปกติบางอย่าง เช่น|(ตัวดำเนินการสำหรับการสลับหรือการแยกตรรกะ ) มันเหนือกว่า PCRE ต่างจาก PCRE ซึ่งรองรับคุณสมบัติเช่นlookarounds, backreferences และการเรียกซ้ำ RE2 สามารถรับรู้ภาษาปกติ ได้เท่านั้น เนื่องจากการสร้างโดยใช้อัลกอริทึม Thompson DFA [ 5 ]นอกจากนี้ยังช้ากว่า PCRE เล็กน้อยสำหรับการดำเนินการจับคู่ในวงเล็บ
PCRE สามารถใช้สแต็กแบบเรียกซ้ำ ขนาดใหญ่ ซึ่งใช้หน่วยความจำสูงและส่งผลให้ เวลาในการทำงานเพิ่มขึ้น แบบทวีคูณสำหรับรูปแบบบางอย่าง ในทางตรงกันข้าม RE2 ใช้ขนาดสแต็กคงที่และรับประกันว่าเวลาในการทำงานจะเพิ่มขึ้นแบบเชิงเส้น (ไม่ใช่แบบทวีคูณ) ตามขนาดของอินพุต หน่วยความจำสูงสุดที่จัดสรรให้กับ RE2 สามารถกำหนดค่าได้ ซึ่งอาจทำให้เหมาะสมกับการใช้งานในแอปพลิเคชันเซิร์ฟเวอร์มากขึ้น ซึ่งต้องการข้อจำกัดในการใช้หน่วยความจำและเวลาในการคำนวณ
การรับเลี้ยงบุตรบุญธรรม
RE2 พร้อมใช้งานสำหรับผู้ใช้Google DocsและGoogle Sheets [ 6 ] Google Sheets รองรับ RE2 ยกเว้นการจับคู่คลาสอักขระ Unicode [ 7 ] RegexExtract ไม่ใช้การ จัดกลุ่ม
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างการใช้งานre2เพื่อป้องกัน การโจมตี ReDoS (การโจมตีปฏิเสธการให้บริการโดยใช้ regular expression) ที่อาจเกิดขึ้น
import < re2 / re2 . h > ;import std ;using std :: string ; using re2 :: RE2 ;int main ( int argc , char * argv []) { string text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!" string pattern = "(a+)+$" ; bool match = RE2 :: FullMatch ( text , pattern ); std :: println ( "ผลการจับคู่: {}" , match ); }ห้องสมุดที่เกี่ยวข้อง
RE2 มาพร้อมกับ wrapper Pythonในตัวซึ่งมีให้ใช้งานบนPython Package Index (PyPI) ในgoogle-re2ชื่อ[ 8 ]
แพ็ก เกจในตัวregexpของGoใช้รูปแบบและการใช้งานแบบเดียวกับ RE2 แม้ว่าจะเขียนด้วยภาษา Go ก็ตาม[ 9 ] ซึ่งไม่น่าแปลกใจเลย เนื่องจาก Go มีพนักงานร่วมกันจากทีม Plan 9
อัลกอริทึม RE2 ได้รับการเขียนใหม่ในภาษา Rustเป็นแพ็กเกจregexไฟร์วอลล์เว็บแอปพลิเคชันของCloudFlareใช้แพ็กเกจนี้เนื่องจากอัลกอริทึม RE2 ต้านทานการโจมตีReDoSได้[ 10 ]
Russ Cox ยังเขียน RE1 ซึ่งเป็นนิพจน์ปกติรุ่นก่อนหน้าที่อิงตามตัวแปลไบต์โค้ด[ 11 ] OpenRestyใช้ RE1 เวอร์ชันแยกที่เรียกว่า "sregex" [ 12 ]
มี การเชื่อมต่อ Java อย่างเป็นทางการ ที่เรียกว่า RE2J ( com.google.re2j) [ 8 ]
ภาษาต่อไปนี้มีการผูกมัดที่ไม่เป็นทางการ: [ 8 ]
- ซี (ครี2)
- ด (re2d)
- เออร์ลัง (re2)
- อินเฟอร์โน (inferno-re2)
- JavaScript (RE2JS) ซึ่งเป็นการพอร์ต RE2J ไปยัง JavaScript
- โนด.เจ. (node-re2)
- OCaml (re2)
- Perl (re-engine-RE2)
- R (re2)
- รูบี้ (re2)
- เว็บแอสเซมบลี (re2-wasm)
ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ RE2 (ซอฟต์แวร์)
RE2เป็นไลบรารีซอฟต์แวร์C++ ซึ่งใช้งานเอ็นจิ้นนิพจน์ปกติโดยใช้เครื่องสถานะจำกัดซึ่งแตกต่างจากไลบรารีนิพจน์ปกติ อื่นๆ ส่วนใหญ่ RE2 ต้องการ C++ เวอร์ชันขั้นต่ำC++17และใช้ไลบรารี...
การเปรียบเทียบกับ PCRE
RE2 ทำงานได้เทียบเท่ากับ นิพจน์ปกติที่เข้ากันได้กับ Perl (PCRE) สำหรับตัวดำเนินการนิพจน์ปกติบางอย่าง เช่น | (ตัวดำเนินการสำหรับ การสลับ หรือ การแยกตรรกะ ) มันเหนือกว่า PCRE ต่างจาก PCRE ซึ่งรองรับคุณสมบัติเช่น lookarounds, backreferences และการเรียกซ้ำ RE2...
การรับเลี้ยงบุตรบุญธรรม
RE2 พร้อมใช้งานสำหรับผู้ใช้ Google Docs และ Google Sheets [ 6 ] Google Sheets รองรับ RE2 ยกเว้นการจับคู่คลาสอักขระ Unicode [ 7 ] RegexExtract ไม่ใช้การ จัดกลุ่ม
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างการใช้งาน re2 เพื่อป้องกัน การโจมตี ReDoS (การโจมตีปฏิเสธการให้บริการโดยใช้ regular expression) ที่อาจเกิดขึ้น