ค้นหาและแทนที่
ค้นหาและแทนที่
Aspose.Words FOSS สำหรับ .NET ให้การค้นหาและแทนที่แบบ regular-expression-based ผ่าน Range.Replace() สามารถกำหนดค่าได้ผ่าน FindReplaceOptions และสำหรับสถานการณ์ขั้นสูง สามารถใช้การนำเข้า IReplacingCallback ที่กำหนดเองจากเนมสเปซ Aspose.Words.Replacing.
ค้นหาและแทนที่พื้นฐาน
Range.Replace(pattern, replacement) ทำการค้นหาและแทนที่ด้วย regular-expression ครอบคลุมช่วง — ทั้งเอกสารเมื่อเรียกบน Document.Range. การ overload ของ Replace(pattern, replacement, options) รับอ็อบเจกต์ FindReplaceOptions เพื่อการควบคุมที่ละเอียดขึ้น: MatchCase และ FindWholeWordsOnly ปรับพฤติกรรมการจับคู่, Direction (ค่าชนิด FindReplaceDirection, Forward หรือ Backward) ควบคุมทิศทางการค้นหา, และ ApplyFont / ApplyParagraphFormat ทำให้การแทนที่สามารถพา formatting ใหม่ไปด้วย ไม่ใช่แค่ข้อความใหม่.
ตัวเลือกที่รับรู้รูปแบบและโครงสร้าง
FindReplaceOptions มีแฟล็กหลายตัวที่กำหนดว่าโครงสร้างใดของเอกสารที่การจับคู่สามารถข้ามหรือละเว้นได้: IgnoreDeleted และ IgnoreInserted ควบคุมว่าข้อความที่มีการติดตามการเปลี่ยนแปลงจะมีส่วนร่วมในการจับคู่หรือไม่, IgnoreFields และ IgnoreFieldCodes ควบคุมว่าข้อความผลลัพธ์ของฟิลด์และโค้ดฟิลด์จะถูกค้นหรือไม่, IgnoreFootnotes ยกเว้นเนื้อหาของเชิงอรรถ/อรรถท้าย, และ IgnoreStructuredDocumentTags กับ IgnoreShapes ยกเว้นการควบคุมเนื้อหาและข้อความรูปทรงตามลำดับ. UseSubstitutions เปิดใช้งานไวยากรณ์การแทนที่ regular-expression (เช่น $1) ในสตริงการแทนที่. LegacyMode และ UseLegacyOrder รักษาพฤติกรรมการจับคู่แบบเก่าสำหรับความเข้ากันได้กับเอกสารที่ประมวลผลโดยตรรกะเวอร์ชันก่อนหน้า.
ตรรกะการแทนที่แบบกำหนดเองด้วย IReplacingCallback
สำหรับตรรกะการแทนที่ที่ไม่สามารถแสดงเป็นสตริงการแทนที่คงที่ได้ ให้ทำการ implement IReplacingCallback และวิธีเดียวของมัน Replacing(args) จากนั้นกำหนดการทำงานให้กับ FindReplaceOptions.ReplacingCallback (หรือส่งตรงไปยังคอนสตรัคเตอร์ FindReplaceOptions(replacingCallback)) คอลแบ็กจะรับอ็อบเจกต์ ReplacingArgs สำหรับแต่ละการจับคู่ ซึ่งเปิดเผย Match (การจับคู่ด้วย regular-expression ด้านล่าง), MatchNode / MatchEndNode (โนดของเอกสารที่มีการจับคู่), MatchOffset, และสตริง Replacement ที่สามารถตั้งค่าได้ การคืนค่า ReplaceAction จากคอลแบ็ก — Replace, Skip, หรือ Stop — จะควบคุมว่าการจับคู่นั้นจะถูกแทนที่, ทิ้งไว้เช่นเดิม, หรือหยุดการทำงานของการค้นหา/แทนที่ทั้งหมด.
เคล็ดลับและแนวปฏิบัติที่ดีที่สุด
- เรียก
Replace()บนDocument.Rangeเพื่อทำการแทนที่ทั่วทั้งเอกสาร, หรือบนRangeที่แคบลง (เช่น ช่วงของส่วนเดียว) เพื่อกำหนดขอบเขตของการดำเนินการ. - ตั้งค่า
FindWholeWordsOnly = trueเพื่อหลีกเลี่ยงการจับคำนำค้นหาเป็นส่วนย่อยของคำที่ยาวกว่า. - ใช้
IgnoreFieldCodes = trueเมื่อคุณต้องการให้การแทนที่ทำงานบนผลลัพธ์ของฟิลด์ที่แสดง, ไม่ใช่บนข้อความคำสั่งฟิลด์พื้นฐาน. - ควรเลือกใช้
IReplacingCallbackแทนการประมวลผลหลังจากนั้นเมื่อข้อความการแทนที่ขึ้นอยู่กับบริบทของการจับคู่ (โนดรอบข้าง, การจัดรูปแบบ, หรือตำแหน่ง) แทนที่จะเป็นสตริงคงที่. - คืนค่า
ReplaceAction.Stopจากคอลแบ็กเพื่อจบการทำงานของการค้นหา/แทนที่เร็วขึ้นเมื่อเงื่อนไขเป็นจริง, แทนที่จะประมวลผลการจับคู่อื่นที่เหลือทั้งหมด.
ปัญหาทั่วไป
| ปัญหา | สาเหตุ | วิธีแก้ไข |
|---|---|---|
| การแทนที่ไม่ใช้การจัดรูปแบบใหม่ | ApplyFont/ApplyParagraphFormat ไม่ได้ตั้งค่าบน FindReplaceOptions | ตั้งค่าคุณสมบัติการจัดรูปแบบที่เกี่ยวข้องบนอ็อบเจ็กต์ options |
| พบการจับคู่ภายในการลบที่ติดตามการเปลี่ยนแปลงโดยไม่คาดคิด | IgnoreDeleted อยู่ที่ค่าเริ่มต้นของมัน | ตั้งค่า IgnoreDeleted = true เพื่อข้ามเนื้อหาการแก้ไขที่ถูกลบ |
| การอ้างอิงกลุ่ม Regex ในข้อความแทนที่ไม่ได้ถูกแทนที่ | UseSubstitutions ไม่ได้เปิดใช้งาน | ตั้งค่า UseSubstitutions = true เพื่อเปิดใช้งานการแทนที่สไตล์ $1 |
| การแทนที่แบบ callback ไม่หยุดตามที่คาดหวัง | Callback คืนค่า Replace/Skip แทน Stop | คืนค่า ReplaceAction.Stop จาก Replacing() เมื่อการดำเนินการควรสิ้นสุด |
FAQ
Range.Replace() รองรับ regular expressions หรือไม่?
ใช่ — อาร์กิวเมนต์ pattern เป็น regular expression ที่จับคู่กับข้อความของช่วง.
ฉันจะทำการแทนที่ข้อความเฉพาะในส่วนที่กำหนดเท่านั้น ไม่ใช่ทั้งเอกสารได้อย่างไร?
เรียก Replace() บน Range ของส่วนนั้นแทน Document.Range.
ฉันจะทำให้ข้อความแทนที่ขึ้นอยู่กับสิ่งที่ถูกจับคู่ได้อย่างไร?
ดำเนินการ IReplacingCallback, อ่านรายละเอียดการจับคู่จาก ReplacingArgs, ตั้งค่า ReplacingArgs.Replacement ให้เป็นข้อความที่คำนวณแล้ว, และคืนค่า ReplaceAction.Replace.
สามารถค้นหา/แทนที่ย้อนหลังผ่านเอกสารได้หรือไม่?
ใช่ — ตั้งค่า FindReplaceOptions.Direction เป็น FindReplaceDirection.Backward.
API Reference สรุป
| คลาส / เมธอด | คำอธิบาย |
|---|---|
Range.Replace() | การค้นหา/แทนที่ด้วย regular-expression ครอบช่วง, พร้อม FindReplaceOptions ตัวเลือก |
FindReplaceOptions | กำหนดค่าพฤติกรรมการจับคู่, การจัดรูปแบบ, และขอบเขตโครงสร้างสำหรับการดำเนินการแทนที่ |
FindReplaceDirection | Enum: Forward, Backward |
IReplacingCallback | อินเทอร์เฟซสำหรับตรรกะการแทนที่แบบกำหนดเองต่อการจับคู่แต่ละครั้ง |
ReplacingArgs | ข้อมูลต่อการจับคู่ที่ส่งต่อให้ IReplacingCallback.Replacing() |
ReplaceAction | Enum ที่ควบคุมผลลัพธ์ต่อแมตช์: Replace, Skip, Stop |