ไทย

เครื่องมือข้อความและชีวิตประจำวัน · ชุดเครื่องมือข้อความ

วิธีการทำงานของการค้นหาทั้งคำ: ขอบเขตคำและปัญหาแมว|สุนัข

· มันทำงานอย่างไร

นิพจน์ทั่วไป ค้นหาและแทนที่ การแก้ไขข้อความ

คำว่าแมวและสุนัขที่ผ่านขอบเขตขณะต่อกันยังคงไม่เปลี่ยนแปลง
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

อธิบายว่าขอบเขตของคำในนิพจน์ทั่วไป JavaScript คืออะไร ทำไม 'cat' จะต้องไม่ตรงกันใน 'concatenate' และเหตุใดจึงต้องจัดกลุ่มการสลับเช่น cat|dog ก่อนที่จะเพิ่มขอบเขต

การเปลี่ยนชื่อที่เปลี่ยน 'การต่อกัน' - เหตุใดการค้นหาและแทนที่คำสั้น ๆ ธรรมดาจึงสร้างความเสียหายให้กับคำที่ยาวกว่า

การเปลี่ยนชื่อผลิตภัณฑ์ดูไม่เป็นอันตรายจนกระทั่งชื่อสั้นปรากฏขึ้นในคำที่ไม่เกี่ยวข้อง การแทนที่ `cat` ทุกรายการด้วย `lynx` จะเปลี่ยน `concatenate` เป็น `conlynxenate` แม้ว่าไม่มีโปรแกรมแก้ไขใดตั้งใจจะเปลี่ยนชื่อส่วนหนึ่งของกริยานั้นก็ตาม จำนวนการจับคู่เพียงอย่างเดียวไม่สามารถป้องกันเอกสารได้เมื่อกฎการค้นหากว้างเกินไป

การจับคู่ทั้งคำจะทำให้กฎแคบลงก่อนที่จะมีการแทนที่ใดๆ ใน ToolAcre การเปิดใช้งาน Whole word ทำให้ `cat` แบบสแตนด์อโลนมีสิทธิ์ โดยปล่อยให้ตัวอักษรเดียวกันนั้นอยู่ภายใน `concatenate` ไม่ถูกแตะต้อง ความแตกต่างนั้นมีโครงสร้างมากกว่าอิงตามพจนานุกรม: เอ็นจิ้นนิพจน์ทั่วไปจะตรวจสอบอักขระทันทีข้างคู่ที่ตรงกันที่เป็นไปได้

\b หมายถึงอะไร — ตำแหน่งความกว้างเป็นศูนย์ระหว่างอักขระคำและอักขระที่ไม่ใช่คำ

ในนิพจน์ทั่วไป JavaScript `` ทำเครื่องหมายขอบเขตคำที่มีความกว้างเป็นศูนย์ ไม่ใช้ตัวอักษร ช่องว่าง หรือเครื่องหมายวรรคตอน แต่จะประสบความสำเร็จในตำแหน่งที่ด้านหนึ่งเป็นอักขระคำและอีกด้านหนึ่งไม่ใช่ รวมถึงจุดเริ่มต้นหรือจุดสิ้นสุดของข้อความเมื่ออักขระที่อยู่ติดกันเข้าข่ายเป็นอักขระคำ

หมวดหมู่ `w` ของ JavaScript มีอักขระคำที่เกี่ยวข้องสำหรับการใช้งานนี้: ASCII ตัวอักษร ตัวเลข และขีดล่าง ดังนั้น `cat` จะจับคู่ `cat` ข้างช่องว่าง เครื่องหมายจุลภาค หรือส่วนท้ายบรรทัด แต่ไม่ใช่ส่วน `cat` ภายใน `concatenate` เนื่องจากทั้งสองด้านของส่วนนั้นดำเนินต่อผ่านอักขระคำ และไม่มีขอบเขตอยู่

ทั้งคำในโหมดตัวอักษร — ข้อความค้นหาจะถูกใช้ Escape ก่อน จากนั้นจึงล้อมด้วยขอบเขต

เมื่อปิด Regex ไว้ ToolAcre จะหลีกอักขระเมตาของนิพจน์ทั่วไปทุกตัวในข้อความค้นหาก่อน จุดยังคงเป็นช่วงเวลาตามตัวอักษร วงเล็บยังคงเป็นวงเล็บตามตัวอักษร และเครื่องหมายบวกยังคงเป็นเครื่องหมายบวก หลังจากขั้นตอนการ Escape นั้น ทั้งคำจะตัดแหล่งที่มาของผลลัพธ์ ดังนั้นเครื่องหมายวรรคตอนของผู้ใช้จะไม่สามารถกลายเป็นไวยากรณ์ regex ได้อย่างเงียบๆ

wrapper คือ `(?:… )` โดยไม่มีช่องว่างที่แสดง: ส่วนด้านใน `(?:…)` เป็นกลุ่มที่ไม่ได้จับภาพ สำหรับตัวอักษรธรรมดาอย่าง `cat` ผลลัพธ์จะเทียบเท่ากับ `cat` การจัดกลุ่มยังคงมีความสำคัญเนื่องจากเส้นทางการคอมไพล์เดียวต้องจัดการคำศัพท์ง่ายๆ และทางเลือกที่ซับซ้อนมากขึ้นได้อย่างปลอดภัยโดยไม่ต้องเปลี่ยนหมายเลขกลุ่มการจับภาพ

ทั้งคำในโหมด regex - ทำไม cat|dog ต้องถูกผูกมัดเป็นกลุ่ม หรือขอบเขตผูกกับสาขาเดียวเท่านั้น

โหมด Regex จะปล่อยให้รูปแบบที่ป้อนไม่เสียหาย แต่ทั้งคำยังคงจัดกลุ่มรูปแบบดังกล่าวก่อนที่จะเพิ่มขอบเขต สำหรับ `cat|dog` นั้น ToolAcre จะรวบรวมรูปแบบแนวคิด `(?:cat|dog)` ดังนั้นทั้งสองทางเลือกจึงต้องเริ่มต้นและสิ้นสุดที่ขอบเขตคำ ดังนั้น `cat` แบบสแตนด์อโลนและ `dog` แบบสแตนด์อโลนจึงตรงกันภายใต้กฎเดียวกัน

หากไม่มีกลุ่มนั้น `cat|dog` จะแบ่งออกเป็นสองสาขา: ขอบเขตด้านซ้ายจะจำกัดเพียง `cat` ในขณะที่ขอบเขตด้านขวาจะจำกัดเพียง `dog` การสลับมีลำดับความสำคัญต่ำกว่าลำดับโดยรอบ การจัดกลุ่มคือสิ่งที่ใช้การยืนยันขอบเขตทั้งสองกับตัวเลือกทั้งหมด แทนที่จะกระจายการยืนยันข้อใดข้อหนึ่งอย่างไม่สม่ำเสมอ

ตัวอย่างการทำงาน — การเปลี่ยนชื่อผลิตภัณฑ์ในเอกสารโดยเปิดทั้งคำ และตรวจสอบจำนวนการเปลี่ยนเทียบกับความคาดหวัง

วางข้อความตัวแทนที่มี `cat`, `dog`, `concatenate`, `dogged` และเครื่องหมายวรรคตอน เช่น `cat, dog.` ป้อน `cat|dog` เปิด Regex และ Whole word แล้วเรียกใช้ แทนที่ทั้งหมด ด้วยชื่อผลิตภัณฑ์ใหม่ คำสัตว์สองตัวแยกกันควรเปลี่ยนไป คำที่ยาวกว่าควรคงอยู่เหมือนเดิมทุกประการ

อ่านจำนวนการเปลี่ยนที่รายงานก่อนที่จะยอมรับการแก้ไข หากเอกสารมีการอ้างอิงแบบสแตนด์อโลนที่รู้จักสามรายการ แต่เครื่องมือรายงานสองหรือสิบสองรายการ ให้เลือกเลิกทำและตรวจสอบบริบทตัวอย่าง ToolAcre นับการจับคู่ก่อนที่จะเรียกการแทนที่สตริงมาตรฐาน ดังนั้นผลรวมที่แสดงจึงเป็นการตรวจสอบเชิงปฏิบัติเกี่ยวกับกฎการค้นหาที่คุณคอมไพล์จริง

ในกรณีที่ขอบเขตคำทำให้คุณประหลาดใจ — อักขระคำของ JavaScript ประกอบด้วยตัวอักษร ASCII ตัวเลข ตัวเลข และขีดล่าง ดังนั้นคำที่เน้นเสียงและไม่ใช่ภาษาละตินจึงจำเป็นต้องทดสอบ

ขอบเขตเหล่านี้ไม่ได้ใช้พจนานุกรมหลายภาษาหรืออัลกอริทึมการแบ่งส่วนข้อความแบบ Unicode เนื่องจากตัวอักษรเน้นเสียงและสคริปต์ที่ไม่ใช่ภาษาละตินอยู่นอกหมวดหมู่คำแบบ ASCII ที่ใช้ในที่นี้ ทั้งคำจึงสามารถคืนค่าศูนย์หรือสร้างตำแหน่งขอบที่น่าประหลาดใจสำหรับคำต่างๆ เช่น `café` เครื่องหมายวรรคตอนในข้อความค้นหาอาจทำให้ข้อมูลไม่ตรงกันเหมือนกัน

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

โดยที่ JavaScript ขอบเขตคำทำให้คุณประหลาดใจ: ASCII- อักขระคำสไตล์ไม่ใช่คำทางภาษา

เครื่องมือนี้ให้ตัวเลือกที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แยกต่างหาก ซึ่งตรงกันข้ามกับความหมายใด ๆ ที่ไม่มีการจัดการเคสจากอินเทอร์เฟซ การล้างข้อมูลจะเพิ่มการตั้งค่าสถานะไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ของ JavaScript อย่างไรก็ตาม การใช้งานจะใช้เฉพาะการจับคู่ส่วนกลางบวกกับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ที่ไม่บังคับ มันไม่ได้เพิ่ม Unicode, multiline, dot-all, Sticky หรือแฟล็กอื่นๆ

บทความนี้ไม่ได้เปลี่ยน `` ให้เป็นขอบเขตที่รับรู้ Unicode หรือแก้ไขโทเค็นเฉพาะภาษา การหลีกเลี่ยงคุณสมบัติ JavaScript ไม่สามารถทดแทนได้ที่นี่ เนื่องจากเครื่องมือไม่ได้รวบรวมรูปแบบด้วยแฟล็ก Unicode สำหรับงานบรรณาธิการหลายภาษา ให้สร้างกรณีทดสอบที่ชัดเจน และเลือกรูปแบบที่โปรแกรมเบราว์เซอร์ใช้งานอยู่

ตัวเลือกเคสมีอยู่ในเครื่องมือ ขอบเขตคำที่รับรู้ Unicode ไม่ได้

คำทั้งหมดเป็นกฎการเรียบเรียง ไม่ใช่กลไกการแทนที่ครั้งที่สอง โหมดตัวอักษรจะหนีจากการค้นหา โหมด regex จะเก็บรักษาไว้ จากนั้นกลุ่มที่ไม่จับกลุ่มเดียวกันและมีขอบเขตสองขอบเขตล้อมรอบผลลัพธ์อย่างใดอย่างหนึ่ง ลำดับดังกล่าวจะช่วยปกป้องเครื่องหมายวรรคตอนตามตัวอักษร และทำให้ทางเลือก regex เช่น `cat|dog` ทำงานเป็นนิพจน์ที่มีขอบเขตเดียว

ใช้ตัวเลือกเมื่อคำที่เป็นลักษณะ ASCII แบบสแตนด์อโลนเป็นเป้าหมายที่ต้องการ จากนั้นให้ถือว่าจำนวนการแทนที่และการควบคุมเลิกทำเป็นการป้องกันมากกว่าการตกแต่ง เปิดการค้นหาและแทนที่ของ ToolAcre ทดสอบการสลับกับตัวอย่างทั้งแบบสแตนด์อโลนและแบบฝัง และนำไปใช้กับเอกสารฉบับสมบูรณ์หลังจากที่ตัวอย่างเหล่านั้นทำงานตามที่คาดไว้เท่านั้น