Problema con trova e sostituisci apostrofo( ' ) in un Word Docx usando OpenXML e Regex

 C Programming >> Programmazione C >  >> Tags >> DocX
Problema con trova e sostituisci apostrofo( ' ) in un Word Docx usando OpenXML e Regex

Il motivo per cui ciò accade è perché sono personaggi diversi.

Word cambia effettivamente alcuni caratteri di punteggiatura dopo averli digitati per dare loro la giusta inclinazione o per migliorare la presentazione.

Ho eseguito lo stesso problema prima e l'ho usato come espressione regolare:[\u2018\u2019\u201A\u201b\u2032']

Quindi sostanzialmente modifica il tuo codice in:

Regex apostropheReplace = new Regex("s\\[\u2018\u2019\u201A\u201b\u2032']s");
docText = apostropheReplace.Replace(docText, "s\'")

Ho scoperto che questi erano i cinque tipi più comuni di virgolette singole e apostrofi utilizzati.

E nel caso in cui ti imbatti nello stesso problema con le virgolette, ecco cosa puoi usare:[\u201C\u201D\u201E\u201F\u2033\u2036\"]


Rispondendo alla domanda:

Se vuoi che una Regex sia in grado di gestire entrambi gli scenari, questa è forse una soluzione semplice e leggibile:

 Regex apostropheReplace = new Regex("s\\['’]s");
 docText = apostropheReplace.Replace(docText, "s\'")

Questo ha l'ulteriore vantaggio di essere comprensibile agli altri sviluppatori che stai tentando di coprire entrambi i casi di apostrofo. Questo vantaggio arriva all'altra parte della tua domanda:

Dipende da cosa intendi per "corretto". Se intendi "più comprensibile per altri sviluppatori", direi di sì, perché ci sarebbe la minima quantità di ricerca necessaria per sapere esattamente cosa sta cercando la tua Regex. Se intendi "più performante", questo non dovrebbe essere un problema con questa semplice ricerca di espressioni regolari (alcuni bei suggerimenti sulle prestazioni delle espressioni regolari possono essere trovati qui).

Se intendi "virgoletta singola più versatile/robusta Regex", allora come sottolinea @Leonardo-Seccia, ci sono altre codifiche di caratteri che potrebbero causare problemi. (Alcuni dei più comuni Microsoft Word sono elencati qui.) Tale soluzione potrebbe assomigliare a questa:

Regex apostropheReplace =
    new Regex("s\\['\u2018\u2019\u201A\u201b]s");
docText = apostropheReplace.Replace(docText, "s\'")

Ma puoi certamente aggiungere altre codifiche di caratteri secondo necessità. Un elenco più completo delle codifiche dei caratteri può essere trovato qui:per aggiungerle alla Regex sopra, cambia semplicemente "U+" in "u" e aggiungilo all'elenco dopo un altro carattere "\". Ad esempio, per aggiungere il simbolo "primo" (′ o U+2032) all'elenco sopra, cambia la stringa RegEx da

Regex("s\\['\u2018\u2019\u201A\u201b]s")

a

Regex("s\\['\u2018\u2019\u201A\u201b\u2032]s")

In definitiva, saresti il ​​giudice di quali codifiche dei caratteri sono le più "corrette" per l'inclusione nella tua Regex in base ai tuoi casi d'uso.


No