Tìm và Thay thế
Tìm và Thay thế
Aspose.Words FOSS cho .NET cung cấp chức năng tìm và thay thế dựa trên biểu thức chính quy qua Range.Replace(), có thể cấu hình qua FindReplaceOptions và, đối với các kịch bản nâng cao, một triển khai IReplacingCallback tùy chỉnh từ không gian tên Aspose.Words.Replacing.
Tìm và Thay thế Cơ bản
Range.Replace(pattern, replacement) thực hiện tìm-thay thế dựa trên biểu thức chính quy trên toàn bộ phạm vi — toàn bộ tài liệu, khi được gọi trên Document.Range. Phiên bản tải chồng Replace(pattern, replacement, options) chấp nhận một đối tượng FindReplaceOptions để kiểm soát chi tiết hơn: MatchCase và FindWholeWordsOnly điều chỉnh hành vi khớp, Direction (một giá trị FindReplaceDirection, Forward hoặc Backward) kiểm soát chiều tìm kiếm, và ApplyFont / ApplyParagraphFormat cho phép phần thay thế mang định dạng mới thay vì chỉ văn bản mới.
Các Tùy chọn Nhận Thức Định Dạng và Cấu Trúc
FindReplaceOptions bao gồm một số cờ xác định cấu trúc tài liệu nào mà một khớp có thể vượt qua hoặc bỏ qua: IgnoreDeleted và IgnoreInserted kiểm soát việc nội dung thay đổi được theo dõi có tham gia vào việc khớp hay không, IgnoreFields và IgnoreFieldCodes kiểm soát việc tìm kiếm văn bản kết quả trường và mã trường, IgnoreFootnotes loại trừ nội dung chú thích/chân chú, và IgnoreStructuredDocumentTags và IgnoreShapes loại trừ điều khiển nội dung và văn bản hình dạng tương ứng. UseSubstitutions bật cú pháp thay thế biểu thức chính quy (như $1) trong chuỗi thay thế. LegacyMode và UseLegacyOrder giữ lại hành vi khớp cũ để tương thích với các tài liệu được xử lý bởi logic trước đây.
Logic Thay Thế Tùy Chỉnh với IReplacingCallback
Đối với logic thay thế không thể biểu diễn bằng một chuỗi thay thế cố định, hãy triển khai IReplacingCallback và phương thức Replacing(args) duy nhất của nó, sau đó gán triển khai cho FindReplaceOptions.ReplacingCallback (hoặc truyền trực tiếp vào bộ tạo FindReplaceOptions(replacingCallback)). Callback nhận một đối tượng ReplacingArgs cho mỗi kết quả khớp, cung cấp Match (kết quả khớp biểu thức chính quy gốc), MatchNode / MatchEndNode (các nút tài liệu chứa kết quả khớp), MatchOffset, và một chuỗi Replacement có thể đặt. Trả về một giá trị ReplaceAction từ callback — Replace, Skip, hoặc Stop — điều khiển việc kết quả khớp đó được thay thế, để nguyên, hoặc dừng toàn bộ thao tác tìm/thay thế.
Mẹo và Thực hành tốt nhất
- Gọi
Replace()trênDocument.Rangeđể thực hiện thay thế toàn tài liệu, hoặc trên mộtRangehẹp hơn (chẳng hạn phạm vi của một phần duy nhất) để giới hạn phạm vi thao tác. - Đặt
FindWholeWordsOnly = trueđể tránh khớp một từ tìm kiếm như là một phần của một từ dài hơn. - Sử dụng
IgnoreFieldCodes = truekhi bạn muốn thay thế áp dụng trên kết quả trường hiển thị, chứ không phải trên văn bản lệnh trường gốc. - Ưu tiên
IReplacingCallbackhơn việc xử lý sau khi thay thế khi văn bản thay thế phụ thuộc vào ngữ cảnh khớp (nút xung quanh, định dạng, hoặc vị trí) thay vì là một chuỗi cố định. - Trả về
ReplaceAction.Stoptừ callback để kết thúc sớm thao tác tìm/thay thế khi một điều kiện được đáp ứng, thay vì xử lý mọi kết quả khớp còn lại.
Các vấn đề thường gặp
| Vấn đề | Nguyên nhân | Khắc phục |
|---|---|---|
| Thay thế không áp dụng định dạng mới | ApplyFont/ApplyParagraphFormat không được đặt trên FindReplaceOptions | Đặt các thuộc tính định dạng liên quan trên đối tượng options |
| Các khớp được tìm thấy bên trong các xóa được theo dõi thay đổi một cách bất ngờ | IgnoreDeleted để ở mặc định | Đặt IgnoreDeleted = true để bỏ qua nội dung phiên bản đã xóa |
| Tham chiếu nhóm Regex trong văn bản thay thế không được thay thế | UseSubstitutions không được bật | Đặt UseSubstitutions = true để bật việc thay thế kiểu $1 |
| Việc thay thế dựa trên callback không dừng lại như mong đợi | Callback trả về Replace/Skip thay vì Stop | Trả về ReplaceAction.Stop từ Replacing() khi thao tác nên kết thúc |
FAQ
Liệu Range.Replace() có hỗ trợ biểu thức chính quy không?
Có — đối số pattern là một biểu thức chính quy, được so khớp với văn bản của phạm vi.
Làm sao tôi có thể thay thế văn bản chỉ trong một phần cụ thể, không phải toàn bộ tài liệu?
Gọi Replace() trên Range của phần đó thay vì Document.Range.
Làm sao tôi có thể làm cho văn bản thay thế phụ thuộc vào những gì đã được khớp?
Triển khai IReplacingCallback, đọc chi tiết khớp từ ReplacingArgs, đặt ReplacingArgs.Replacement thành văn bản đã tính toán, và trả về ReplaceAction.Replace.
Có thể tìm/đổi chỗ theo chiều ngược lại trong tài liệu không?
Có — đặt FindReplaceOptions.Direction thành FindReplaceDirection.Backward.
API Reference Tóm tắt
| Lớp / Phương thức | Mô tả |
|---|---|
Range.Replace() | Tìm/Thay thế bằng biểu thức chính quy trên một phạm vi, với FindReplaceOptions tùy chọn |
FindReplaceOptions | Cấu hình hành vi khớp, định dạng và phạm vi cấu trúc cho các thao tác thay thế |
FindReplaceDirection | Enum: Forward, Backward |
IReplacingCallback | Interface cho logic thay thế tùy chỉnh cho mỗi khớp |
ReplacingArgs | Dữ liệu mỗi khớp được truyền tới IReplacingCallback.Replacing() |
ReplaceAction | Enum kiểm soát kết quả mỗi trận: Replace, Skip, Stop |