เครื่องมือข้อความและชีวิตประจำวัน · ชุดเครื่องมือข้อความ
จาก Kleene ถึง JavaScript: ประวัติโดยย่อของนิพจน์ทั่วไป
· พื้นหลัง
การแสดงออกปกติ javascript ประวัติคอมพิวเตอร์
ติดตามนิพจน์ทั่วไปจากทฤษฎีออโตมาตาในปี 1950 ไปจนถึง ed, grep และ Perl ไปจนถึง JavaScript ในทุกเบราว์เซอร์ โดยอธิบายว่าเหตุใดไวยากรณ์จึงมีลักษณะเช่นนั้นและฟีเจอร์ใดมาถึงเมื่อใด
ภาษาเล็กๆ แปลกๆ ที่ทุกคนรู้เพียงครึ่งเดียว — เหตุใดไวยากรณ์ regex จึงให้ความรู้สึกโบราณและไม่สอดคล้องกัน
สำนวนปกติให้ความรู้สึกเหมือนภาษาที่รวบรวมข้ามยุคสมัยเพราะนั่นคือสิ่งที่เป็นอยู่ แกนหลักขนาดกะทัดรัดของการสลับ การทำซ้ำ และการจัดกลุ่มเติบโตจากสัญกรณ์ทางคณิตศาสตร์ไปเป็นคำสั่งของตัวแก้ไข ตัวกรองบรรทัดคำสั่ง และคุณสมบัติภาษาการเขียนโปรแกรม เครื่องหมายวรรคตอนยังคงอยู่ในขณะที่แต่ละโฮสต์เพิ่มความสะดวก ข้อจำกัด และคำศัพท์เฉพาะของตัวเอง
ประวัติดังกล่าวอธิบายว่าทำไมรูปแบบจึงดูคุ้นเคย แต่มีพฤติกรรมที่แตกต่างกันระหว่าง grep, Perl, Python และ JavaScript “Regex” เป็นชื่อสกุล ไม่ใช่ไวยากรณ์สากลเพียงคำเดียว สำหรับนักวิเคราะห์ที่เรียนรู้ด้วยตนเอง บทเรียนที่มีประโยชน์ไม่ใช่การจดจำภาษาถิ่นทุกภาษา แต่เป็นการระบุกลไก ธง และกฎการเปลี่ยนก่อนที่จะเชื่อถือรูปแบบที่ยืมมา
เหตุการณ์ปกติของ Kleene - คณิตศาสตร์ของออโตมาตาจำกัดในช่วงปี 1950 ที่ให้ดาวแก่เรา
งานของ Stephen Cole Kleene เกี่ยวกับออโตมาตาจำกัดและ "เหตุการณ์ปกติ" ได้ให้รากฐานทางทฤษฎีในช่วงทศวรรษ 1950 สัญกรณ์ของเขาอธิบายชุดของลำดับสัญลักษณ์โดยใช้การดำเนินการรวมถึงการรวม การต่อข้อมูล และการปิด การดำเนินการปิดกลายเป็นดาวเด่นของ Kleene: `A*` หมายถึงการทำซ้ำเป็นศูนย์หรือมากกว่าที่ดึงมาจาก A ไม่ใช่แค่ "ทำซ้ำหนึ่งครั้งหรือมากกว่า"
ภาษาปกติอย่างเป็นทางการที่ได้รับการยอมรับโดยไฟไนต์ออโตมาตะนั้นแคบกว่าโครงสร้างจำนวนมากที่ขายภายใต้ป้ายกำกับ regex ในปัจจุบัน ตัวอย่างเช่น การอ้างอิงย้อนกลับสามารถแสดงเงื่อนไขที่นอกเหนือไปจากโมเดลคลาสสิกนั้นได้ เอ็นจิ้นสมัยใหม่จึงรักษาชื่อทางประวัติศาสตร์และสัญลักษณ์ส่วนใหญ่ไว้ ในขณะที่ใช้ภาษารูปแบบซึ่งความสามารถและกลยุทธ์การดำเนินการขยายไปไกลกว่าวัตถุทางคณิตศาสตร์ดั้งเดิมของ Kleene
Thompson, ed และ grep — regex เข้าสู่การแก้ไขข้อความในช่วงปลายทศวรรษ 1960 และต้นทศวรรษ 1970 ได้อย่างไร เครื่องมือ Unix
Ken Thompson เชื่อมโยงทฤษฎีกับเครื่องมือข้อความที่ใช้งานได้ การสื่อสาร 1968 ของเอกสาร ACM ของเขาอธิบายการรวบรวมนิพจน์ทั่วไปเป็นรหัสเครื่องเพื่อค้นหาข้อความ และงานแก้ไขก่อนหน้านี้ของเขาช่วยวางรูปแบบที่ตรงกันภายในเชื้อสาย Unix โปรแกรมแก้ไข `ed` ใช้นิพจน์ทั่วไปในคำสั่งที่เลือกและแปลงบรรทัดที่ตรงกัน
ชื่อ `grep` มาจากคำสั่ง `ed` โดยทั่วไปจะแสดงผลเป็น `g/re/p`: เลือกบรรทัดทั่วโลกที่ตรงกับนิพจน์ทั่วไปแล้วพิมพ์ออกมา grep ยุคแรกไม่ใช่คอลเลกชันของตัวเลือก GNU ในปัจจุบัน และรูปแบบ POSIX แบบพื้นฐานและแบบขยายในภายหลังจะแตกต่างกัน การเปลี่ยนแปลงที่ยั่งยืนนั้นเกิดขึ้นได้จริง: ภาษาสัญลักษณ์เล็กๆ กลายเป็นอินเทอร์เฟซสำหรับการค้นหาข้อความในชีวิตประจำวัน
Perl และ PCRE — ส่วนขยายที่เพิ่มตัวระบุปริมาณที่ไม่โลภ lookaround และไวยากรณ์ที่เครื่องมือส่วนใหญ่คัดลอกในปัจจุบัน
Perl สร้างภาษารูปแบบที่สมบูรณ์ยิ่งขึ้นซึ่งเป็นศูนย์กลางของการเขียนโปรแกรมเพื่อวัตถุประสงค์ทั่วไป ในเวอร์ชันต่างๆ โปรแกรมเมอร์พบกับกลุ่มการดักจับ การอ้างอิงย้อนกลับ การยืนยัน ตัวระบุปริมาณแบบขี้เกียจ และตัวแก้ไขรูปแบบในระบบนิเวศที่มองเห็นได้ชัดเจนเพียงแห่งเดียว โครงสร้างบันทึกเอกสาร Perl 5 เช่น `*?` สำหรับการจับคู่ขั้นต่ำและ `(?=...)` สำหรับ lookahead เชิงบวก ควบคู่ไปกับคุณสมบัติมากมายที่ขาดหายไปจากรูปแบบ Unix ที่เก่ากว่า
จะปลอดภัยกว่าที่จะบอกว่า Perl ทำให้สไตล์นี้เป็นที่นิยมมากกว่าการให้เครดิตกับการคิดค้นส่วนขยายทุกรายการ PCRE จงใจเสนอไวยากรณ์ที่เข้ากันได้กับ Perl ในขณะที่กลไกอื่นๆ นำแนวคิดที่เลือกมาและปฏิเสธแนวคิดอื่นๆ เครื่องหมายวรรคตอนที่ใช้ร่วมกันสามารถซ่อนความหมาย พฤติกรรม Unicode หรือประสิทธิภาพที่แตกต่างกันได้ “ลักษณะ Perl” จึงอธิบายถึงอิทธิพลในวงกว้าง ไม่ใช่การรับประกันว่ารูปแบบ Perl สามารถพกพาได้
Perl ทำให้ภาษารูปแบบเชิงปฏิบัติแพร่หลายมากขึ้น เครื่องยนต์ต่อมายืมแบบคัดเลือก
JavaScript สร้างมาตรฐานให้กับออบเจ็กต์ `RegExp` และไวยากรณ์ตามตัวอักษรของตัวเอง เช่น `/pattern/gi` สำหรับโปรแกรมที่ทำงานในเบราว์เซอร์และสภาพแวดล้อม ECMAScript อื่นๆ รสชาติประกอบด้วยกลุ่มการจับและไม่จับ การอ้างอิงด้านหลัง lookahead ตัวระบุปริมาณแบบขี้เกียจ และคลาสอักขระ รุ่นต่อมาได้เพิ่มกลุ่มการจับที่มีชื่อและการยืนยันแบบมองหลังในข้อกำหนด ES2018
JavaScript ไม่ใช่ PCRE หรือ Python ที่มีตัวคั่นต่างกัน ความพร้อมใช้งานของฟีเจอร์ขึ้นอยู่กับรุ่น ECMAScript ที่ใช้งานโดยเอ็นจิ้น และแฟล็กเป็นส่วนหนึ่งของลักษณะการทำงานมากกว่าการตกแต่ง คู่มือนิพจน์ทั่วไปของ MDN เป็นข้อมูลอ้างอิงเชิงปฏิบัติที่เกี่ยวข้องสำหรับไวยากรณ์ของเบราว์เซอร์ แต่แม้แต่ตัวอย่าง JavaScript ที่ถูกต้องก็อาจต้องอาศัยแฟล็กที่อินเทอร์เฟซเฉพาะไม่เปิดเผย
JavaScript ได้รับกลุ่มที่มีชื่อและมองไปข้างหลังใน ES2018 แต่กลไกและแฟล็กยังคงแตกต่างกัน
เบราว์เซอร์วางเอ็นจิ้นนิพจน์ทั่วไป JavaScript ไว้ใกล้กับงานข้อความทั่วไป หน้าเว็บสามารถรวบรวมรูปแบบ นับรายการที่ตรงกัน และส่งไปยัง `String.prototype.replace` โดยไม่ต้องส่งข้อความไปยังบริการ regex เฉพาะทาง ความพร้อมใช้งานดังกล่าวทำให้อินเทอร์เฟซการค้นหาและแทนที่ฝั่งเบราว์เซอร์เป็นไปได้ แม้ว่าเพจโดยรอบจะต้องได้รับการตรวจสอบแยกต่างหากเพื่อการอ้างสิทธิ์ความเป็นส่วนตัวในวงกว้าง
การใช้งานของ ToolAcre เรียก `new RegExp` ภายใน `compilePattern` จับความล้มเหลวในการคอมไพล์และส่งกลับข้อผิดพลาดแทนที่จะส่งกลับ `findReplace` นับการจับคู่ก่อนที่จะใช้การดำเนินการแทนที่มาตรฐาน ด้วยเหตุนี้ JavaScript โทเค็นการแทนที่ เช่น การอ้างอิงการจับภาพจะเป็นไปตามสตริงโฮสต์ API; ไวยากรณ์ regex และไวยากรณ์การแทนที่มีความสัมพันธ์กันแต่เป็นภาษาที่แตกต่างกัน
สิ่งนี้ไม่ครอบคลุมถึง - ทฤษฎีภาษาทางการที่นอกเหนือไปจากพื้นฐานและสมรรถนะภายในของเครื่องยนต์
ประวัติโดยย่อนี้ไม่ได้พิสูจน์ความเท่าเทียมกันระหว่างเอ็นจิ้นเชิงปฏิบัติและออโตมาตาจำกัด อัลกอริธึมการดำเนินการสำรวจ regex หรือการจัดอันดับการใช้งานตามความเร็ว การย้อนรอย เทคนิคเชิงเส้นเวลา และรูปแบบทางพยาธิวิทยาสมควรได้รับการรักษาแยกกัน ตัวป้องกัน ToolAcre จับข้อผิดพลาดทางไวยากรณ์ แต่ตรวจไม่พบนิพจน์ที่ถูกต้องที่ทำการย้อนรอยมากเกินไป และทำให้เธรดเบราว์เซอร์หลักหยุดทำงาน
และไทม์ไลน์ไม่ได้กำหนด meta character ทุกตัวให้กับนักประดิษฐ์เพียงคนเดียว คุณสมบัติของซอฟต์แวร์มักจะมาผ่านทางเอกสาร บรรณาธิการ การเผยแพร่ภาษา และการปรับใช้ที่เข้ากันได้มากกว่าการส่งต่อที่สะอาดหมดจดเพียงครั้งเดียว แหล่งที่มาสนับสนุนเหตุการณ์สำคัญเฉพาะ พวกเขาไม่ได้พิสูจน์เรื่องราวที่เรียบง่ายกว่านั้นว่าผลิตภัณฑ์หนึ่งสร้างการขายส่ง regex สมัยใหม่ หรือรสชาติในภายหลังสืบทอดพฤติกรรมที่เหมือนกัน
ประเด็นสำคัญ — โหมด regex ของ Text Toolkit นั้นมีรสชาติ JavaScript ดังนั้นรูปแบบจากเอกสารประกอบของเบราว์เซอร์จึงทำงานตามที่เขียนไว้
การสืบทอดในทางปฏิบัติสามารถมองเห็นได้ใน ToolAcre: เปิด Regex และข้อความค้นหาจะถูกรวบรวมโดยเอ็นจิ้น JavaScript ของเบราว์เซอร์ ปล่อยให้ Regex ปิดและอักขระเมตาจะถูกหลีก ทำให้การค้นหาตามตัวอักษร ทั้งคำจะล้อมนิพจน์ด้วยขอบเขต ASCII สไตล์ `` ในขณะที่การพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่จะควบคุมว่าแฟล็ก `i` จะมาพร้อมกับแฟล็ก `g` ส่วนกลางที่แสดงตลอดเวลาหรือไม่
รายละเอียดสุดท้ายนั้นแก้ไขคำสัญญากว้างๆ ของโครงร่างที่ว่ารูปแบบเอกสารประกอบของเบราว์เซอร์ทำงานตามที่เขียนไว้ ToolAcre ไม่เปิดเผยแฟล็กแบบหลายบรรทัด, dot-all, Sticky หรือ Unicode ดังนั้นตัวอย่างที่ต้องใช้ `m`, `s`, `y`, `u` หรือ `v` จำเป็นต้องมีการปรับเปลี่ยน และบางส่วนไม่สามารถทำซ้ำได้ ใช้เครื่องมือเพื่อทดสอบรูปแบบ JavaScript ที่รองรับ อ่านจำนวนการแทนที่ และเลิกทำก่อนการปรับปรุง