Εύρεση και Αντικατάσταση
Εύρεση και Αντικατάσταση
Aspose.Words FOSS για .NET παρέχει αντικατάσταση βασισμένη σε εκφράσεις κανονικής μορφής μέσω Range.Replace(), ρυθμιζόμενη μέσω FindReplaceOptions και, για προχωρημένα σενάρια, μια προσαρμοσμένη υλοποίηση IReplacingCallback από το χώρο ονομάτων Aspose.Words.Replacing.
Βασική Εύρεση και Αντικατάσταση
Range.Replace(pattern, replacement) εκτελεί αναζήτηση και αντικατάσταση με εκφράσεις κανονικής μορφής σε όλο το εύρος — ολόκληρο το έγγραφο, όταν κληθεί σε Document.Range. Η υπερφόρτωση Replace(pattern, replacement, options) δέχεται ένα αντικείμενο FindReplaceOptions για πιο λεπτομερή έλεγχο: τα MatchCase και FindWholeWordsOnly ρυθμίζουν τη συμπεριφορά του αντιστοίχου, το Direction (μια τιμή FindReplaceDirection, Forward ή Backward) ελέγχει την κατεύθυνση αναζήτησης, και τα ApplyFont / ApplyParagraphFormat επιτρέπουν σε μια αντικατάσταση να μεταφέρει νέα μορφοποίηση αντί μόνο νέου κειμένου.
Επιλογές Ευαισθησίας Μορφοποίησης και Δομικές
FindReplaceOptions περιλαμβάνει αρκετές σημαίες που καθορίζουν ποια δομικά στοιχεία του εγγράφου μπορεί να διασχίσει ή να αγνοήσει μια αντιστοίχηση: τα IgnoreDeleted και IgnoreInserted ελέγχουν αν το περιεχόμενο αλλαγών παρακολούθησης συμμετέχει στην αντιστοίχηση, τα IgnoreFields και IgnoreFieldCodes ελέγχουν αν το κείμενο αποτελέσματος πεδίου και οι κώδικες πεδίου αναζητούνται, το IgnoreFootnotes εξαιρεί το περιεχόμενο υποσημειώσεων/σημειώσεων τέλους, και τα IgnoreStructuredDocumentTags και IgnoreShapes εξαιρούν αντίστοιχα τα ελεγκτικά περιεχομένου και το κείμενο σχήματος. Το UseSubstitutions ενεργοποιεί τη σύνταξη αντικατάστασης με εκφράσεις κανονικής μορφής (όπως το $1) στη συμβολοσειρά αντικατάστασης. Τα LegacyMode και UseLegacyOrder διατηρούν παλαιότερη συμπεριφορά αντιστοίχησης για συμβατότητα με έγγραφα που επεξεργάστηκαν από προηγούμενη λογική.
Προσαρμοσμένη Λογική Αντικατάστασης με IReplacingCallback
Για τη λογική αντικατάστασης που δεν μπορεί να εκφραστεί ως σταθερή συμβολοσειρά αντικατάστασης, υλοποιήστε το IReplacingCallback και τη μοναδική του μέθοδο Replacing(args), στη συνέχεια εκχωρήστε την υλοποίηση στο FindReplaceOptions.ReplacingCallback (ή περάστε την απευθείας στον κατασκευαστή FindReplaceOptions(replacingCallback)). Η κλήση επιστροφής (callback) λαμβάνει ένα αντικείμενο ReplacingArgs για κάθε αντιστοίχηση, εκθέτοντας το Match (η υποκείμενη αντιστοίχηση κανονικής έκφρασης), το MatchNode / MatchEndNode (οι κόμβοι του εγγράφου που περιέχουν την αντιστοίχηση), το MatchOffset, και μια ρυθμιζόμενη συμβολοσειρά Replacement. Η επιστροφή μιας τιμής ReplaceAction από το callback — 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() υποστηρίζει κανονικές εκφράσεις;
Ναι — το όρισμα pattern είναι μια κανονική έκφραση, που ταιριάζει με το κείμενο του εύρους.
Πώς μπορώ να αντικαταστήσω κείμενο μόνο μέσα σε συγκεκριμένο τμήμα, όχι σε ολόκληρο το έγγραφο;
Καλέστε το Replace() στο Range του τμήματος αυτού αντί για το Document.Range.
Πώς μπορώ να κάνω το κείμενο αντικατάστασης εξαρτώμενο από το τι ταιριάστηκε;
Εφαρμόστε το IReplacingCallback, διαβάστε τις λεπτομέρειες της αντιστοίχισης από το ReplacingArgs, ορίστε το ReplacingArgs.Replacement στο υπολογισμένο κείμενο και επιστρέψτε το ReplaceAction.Replace.
Μπορεί η αναζήτηση εύρεσης/αντικατάστασης να γίνει προς τα πίσω μέσα στο έγγραφο;
Ναι — ορίστε το FindReplaceOptions.Direction σε FindReplaceDirection.Backward.
API Reference Περίληψη
| Κλάση / Μέθοδος | Περιγραφή |
|---|---|
Range.Replace() | Αναζήτηση/αντικατάσταση με κανονική έκφραση σε εύρος, με προαιρετικό FindReplaceOptions |
FindReplaceOptions | Διαμορφώνει τη συμπεριφορά αντιστοίχισης, τη μορφοποίηση και το δομικό πεδίο για λειτουργίες αντικατάστασης |
FindReplaceDirection | Απαρίθμηση: Forward, Backward |
IReplacingCallback | Διεπαφή για προσαρμοσμένη λογική αντικατάστασης ανά αντιστοίχιση |
ReplacingArgs | Δεδομένα ανά αντιστοίχιση που μεταβιβάζονται στο IReplacingCallback.Replacing() |
ReplaceAction | Enum που ελέγχει το αποτέλεσμα ανά αγώνα: Replace, Skip, Stop |