0
votes

Le remplacement de mots dans un document Word entraîne un remplacement multiple par C #

J'ai besoin de créer un programme C # .NET qui recherchera des mots spécifiques dans un document Microsoft Word et le remplacera par d'autres mots. Par exemple, dans mon fichier Word, il y a un texte qui est - LeadSoft IT . Ce «LeadSoft IT» sera remplacé par - LeadSoft IT Limited . Maintenant, il y a un problème qui est que, pour la première fois, LeadSoft IT sera remplacé par LeadSoft IT Limited. Mais si je lance à nouveau le programme, cela changera à nouveau LeadSoft IT et la prochaine fois, le texte sera LeadSoft IT Limited Limited . C'est un problème. Quelqu'un peut-il me suggérer comment résoudre ce problème avec du code C # pour remplacer des mots dans un document Word.


0 commentaires

3 Réponses :


1
votes

Si vous avez déjà un script pour cela, n'hésitez pas à le poster et j'essaierai de vous aider davantage.

Je ne sais pas quelle fonctionnalité vous utilisez pour trouver l'instance de texte, mais je suggérerais de regarder dans regex et d'utiliser quelque chose comme (LeadSoft IT(?! Limited)) .

Regex: https://regexr.com/ Un bon testeur de regex: https://www.regextester.com/109925

Edit: j'ai créé un script Python qui utilise regex pour remplacer les instances:

import re

word_doc = "We like working " \
           "here at Leadsoft IT.\n" \
           "We are not limited here at " \
           "Leadsoft It Limited."

replace_str = "Leadsoft IT Limited"

reg_str = '(Leadsoft IT(?!.?Limited))'

fixed_str = re.sub(reg_str, replace_str, word_doc, flags=re.IGNORECASE)

print(fixed_str)

# Prints:
# We like working here at Leadsoft IT Limited.
# We are not limited here at Leadsoft It Limited.

Edit 2: Code recréé en C #: https://gist.github.com/Zylvian/47ecd6d1953b8d8c3900dc30645efe98

L'expression régulière vérifie la chaîne entière pour les instances où Leadsoft IT n'est PAS suivi de Limited , et pour toutes ces instances, remplace Leadsoft IT par Leadsoft IT Limited .

Le regex utilise ce qu'on appelle une "anticipation négative (?!)" Qui s'assure que la chaîne à gauche n'est pas suivie par la chaîne à droite. N'hésitez pas à modifier l'expression régulière comme bon vous semble, mais sachez que la correspondance est très forte.

Si vous souhaitez mieux comprendre la chaîne de regex, n'hésitez pas à la copier sur https://www.regextester.com/ .

Dis moi si ça aide!


7 commentaires

pouvez-vous me partager ce que serait le Regex?


Bien sûr, donnez-moi une minute.


@ mnu-nasir J'ai mis à jour ma réponse. :)


Merci pour votre réponse.


@ mnu-nasir Si vous avez le script avec lequel vous travaillez - celui qui écrase trop - je pourrais vous donner quelques conseils. :)


Merci. je vous ferai savoir


@ mnu-nasir Ajout d'une version C #.



1
votes

De manière simpliste, vous pouvez simplement exécuter un autre remplacement pour résoudre le problème que vous causez:

var find = "LeadSoft IT";
var repl = "LeadSoft IT Limited";

var result = document.Replace(find, repl);

var problemWillOccur = repl.Contains(find);

if(problemWillOccur){

  var fixProblemByFinding = repl.Replace(find, repl); //is "LeadSoft IT Limited Limited"

  result = result.Replace(fixProblemByFinding, repl);

}

Si vous recherchez une correction plus générique de cela qui ne code pas en dur la chaîne de problème, envisagez d'examiner si la chaîne que vous trouvez est à l'intérieur de la chaîne que vous remplacez, ce qui signifie que le problème se produit. Cela signifie que vous devez exécuter un deuxième remplacement sur le document qui trouve le résultat de l'exécution du remplacement sur le remplacement

s = s.Replace("LeadSoft IT", "LeadSoft IT Limited").Replace("LeadSoft IT Limited Limited", "LeadSoft IT Limited");


0 commentaires

0
votes

Vous serez peut-être intéressé par la manière dont je résous ce problème. Au début, j'utilisais NPOI mais cela créait un désordre avec le document, alors j'ai découvert qu'un fichier DOCX est simplement une archive ZIP avec des XML.

https://github.com/kubala156/DociFlow/blob/main/DociFlow.Lib/Word/SeekAndReplace.cs

Usage:

var vars = Dictionary<string, string>() 
{
    { "testtag", "Test tag value" }
}
using (var doci = new DociFlow.Lib.Word.SeekAndReplace())
{
    // test.docx contains text with tag "{{testtag}}" it will be replaced with "Test tag value"
    doci.Open("test.docx");
    doci.FindAndReplace(vars, "{{", "}}");
}


0 commentaires