Me revoilà avec deux codes, dans les deux cas, j'initie au début si on cherche par mot entier et si on respecte la casse.
Le premiers reprend ce que j'avais fait hier, tout en regex avec la double passe
Private Sub FindReplaceDeuxPasses()
Dim path As String = Application.StartupPath & "\test"
Dim txtFiles() As String = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories) 'répère le nom des fichiers dans le répertoire et sous les répertoires
Dim mot As String = "coucou" 'le mot à trouver
Dim remplacement As String = "Remplacé"
Dim monOption As RegexOptions = RegexOptions.None 'ici on choisi entre None et IgnoreCase
Dim motEntier As Boolean = True 'ici on choisit mot entier ou pas
For Each fichier As String In txtFiles
Dim texte As String = File.ReadAllText(fichier)
Dim nouveauTexte As String
If motEntier Then
nouveauTexte = Regex.Replace(texte, "(^|\W)" & mot & "($|\W)", Function(match) match.Value.Replace(mot, remplacement), monOption) 'retourne le texte trouvé par la regex dans lequel on change mot par remplacement
nouveauTexte = Regex.Replace(nouveauTexte, "(^|\W)" & mot & "($|\W)", Function(match) match.Value.Replace(mot, remplacement), monOption) 'retourne le texte trouvé par la regex dans lequel on change mot par remplacement
Else
nouveauTexte = Regex.Replace(texte, mot, remplacement, monOption)
End If
File.WriteAllText(fichier.Replace(".txt", "-1.txt"), nouveauTexte)
Next fichier
End Sub
Le second est une variante de l'idée d'Ucfoutu avec le split.
Je me sers d'une regex pour chercher toutes les occurrences du mot (pas entier), puis je teste par regex le texte immédiatement autour et recompose le texte en fonction. Je n'ai pas jugé utile de faire un string.Join() à la fin comme le code d'Uc, car j'ai déjà une boucle qui tourne et donc la reconstitution du texte ne perd pas trop de temps.
Private Sub FindReplaceAvecSplit()
Dim path As String = Application.StartupPath & "\test"
Dim txtFiles() As String = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories) 'répère le nom des fichiers dans le répertoire et sous les répertoires
Dim mot As String = "coucou" 'le mot à trouver
Dim remplacement As String = "Remplacé"
Dim monOption As RegexOptions = RegexOptions.None 'ici on choisi entre None et IgnoreCase
Dim motEntier As Boolean = True 'ici on choisit mot entier ou pas
For Each fichier As String In txtFiles
Dim texte As String = File.ReadAllText(fichier)
Dim nouveauTexte As String
If motEntier Then
Dim maRegex As New Regex(mot, monOption) 'parttern qui recherche juste le mot
Dim matches As MatchCollection = maRegex.Matches(texte) ' retourne la collection des occurences
Dim split() As String = texte.Split({mot}, StringSplitOptions.None)
Dim indexSplit As Integer = 0
nouveauTexte = split(indexSplit)
indexSplit += 1
For Each m As Match In matches
'extrait de texte
Dim index As Integer = If(m.Index > 0, m.Index - 1, 0) 'on prend un caractère avant l'occurence si c'est possible
Dim longueur As Integer = If(m.Index + m.Length < texte.Length, m.Length + 2, texte.Length - index) 'l'extrait de texte ne doit pas depasser le texte
Dim extrait As String = texte.Substring(index, longueur)
Dim pattern As String = String.Format("(\W{0}\W)|(^{0}\W)|(\W{0}$)|(^{0}$)", mot)
If Regex.IsMatch(extrait, pattern) Then
nouveauTexte &= remplacement
Else
nouveauTexte &= mot
End If
If indexSplit < split.Length Then
nouveauTexte &= split(indexSplit)
indexSplit += 1
End If
Next m
Else
nouveauTexte = Regex.Replace(texte, mot, remplacement, monOption)
End If
File.WriteAllText(fichier.Replace(".txt", "-1.txt"), nouveauTexte)
Next fichier
End Sub
10 févr. 2015 à 00:35