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ên Document.Range để thực hiện thay thế toàn tài liệu, hoặc trên một Range hẹ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 = true khi 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 IReplacingCallback hơ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.Stop từ 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ânKhắc phục
Thay thế không áp dụng định dạng mớiApplyFont/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 đợiCallback trả về Replace/Skip thay vì StopTrả 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ứcMô 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
FindReplaceOptionsCấ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ế
FindReplaceDirectionEnum: Forward, Backward
IReplacingCallbackInterface cho logic thay thế tùy chỉnh cho mỗi khớp
ReplacingArgsDữ liệu mỗi khớp được truyền tới IReplacingCallback.Replacing()
ReplaceActionEnum kiểm soát kết quả mỗi trận: Replace, Skip, Stop

Xem thêm

 Tiếng Việt