[VB6][STRING] Chaine et remplacement sous-chaine

cs_EXCLUSIF Messages postés 59 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 9 août 2007 - 10 juil. 2007 à 19:12
cs_EXCLUSIF Messages postés 59 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 9 août 2007 - 10 juil. 2007 à 20:29
Bonjour à tous,


Je me bats afin de trouver une solution pour remplacer une sous-chaine de caractère dans une chaine.


Exemple de chaine : "Ciseler le persil"

Exemple de sous-chaine à remplacer: "sel" -> à remplacer par sel


Bien entendu je ne dois faire le remplacement que si la sous-chaine ne
fait pas partie d'un mot plus grand ("Ciseler" dans mon cas). Dans mon exemple donc le remplacement ne sera pas effectuer. En revanche si ma chaine principale était "ajouter du sel." alors le mot "sel" aurait été remplacé par "sel" et ma chaine serait donc "ajouter du sel."


Je ne dois la remplacer que si le caractère avant la sous-chaine est un
espace, un point ou une virgule (OU si la sous-chaine est au debut de
la chaine) ET si le caractère suivant la sous chaine est un espace, un
point ou une virgule (OU si la sous-chaine est à la fin de la chaine).


Merci pour votre aide.


Ludo

3 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
10 juil. 2007 à 19:27
Bonjour,


 


Il me semble bien avoir (sur ce forum ??... je ne sais plus...) déjà vu ce "truc" là !


Mais dis-moi, t'as oublié des trucs ( les parenthèses possibles devant et/ou derrière, les guimllemets possibles, devant et/ou derrière, la gestion de la casse, etc... etc..., non ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
10 juil. 2007 à 19:45
Salut
Si tu travailles sur une chaine dans une variable, comme tu l'as souligné, il va falloir tester le caractère situé devant et derrière.
Pour repérer un texte : Instr
Une fois que cette fonction t'aura fourni l'emplacement du début du mot, suffira de tester :
- si c'est le 1er caractère de la chaine
- si le caractère avant (réponse - 1) est un espace, parenthèse ou ponctuation
- si le caractère après (réponse + longueur du mot + 1) est un espace, parenthèse ou ponctuation ou la fin du texte.

Si tu travailles dans une RichTextBox, idée : la fonction SPAN permet de rechercher en avant ou en arrière une série de caractères.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
0
cs_EXCLUSIF Messages postés 59 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 9 août 2007 1
10 juil. 2007 à 20:29
Merci à vous 2 pour vos réponses rapides. En effet jmfmarques il faudra que je rajoute les parenthèses etc... (la casse n'a pas d'importance) mais une fois que le plus gros sera fait, je n'aurai plus qu'à les rajouter.

Merci pour tes suggestions jack, ca conforte ce que j'avais commencé à faire, hélas ca ne fonctionne pas du tout et je ne sais pas du tout pourquoi. Enfin si je sais, c'est que je suis un newbie ;-)

SQl = "SELECT * FROM T_Ingredients"
qr.Open SQl, db, adOpenKeyset, adLockOptimistic
qr.MoveFirst
WhileNot qr.EOF
MyPos = InStr(1, strMyHtml, qr!IngredientPluriel)
Dim strCaracterePrecedent AsString
Dim strCaractereSuivant AsString
Dim boolCaracterePrecedent AsBoolean
Dim boolCaractereSuivant AsBoolean
boolCaracterePrecedent = False
boolCaractereSuivant = False

If MyPos > 1Then
'JE RELEVE LE CARACTERE JUSTE AVANT
strCaracterePrecedent = Mid(strMyHtml, MyPos - 1, 1)
SelectCase strCaracterePrecedent
Case" ", ".", "!", "?", ":", ";"
boolCaracterePrecedent = True
CaseElse
boolCaracterePrecedent = False
EndSelect
MsgBox ("strCaracterePrecedent : " & strCaracterePrecedent)
MsgBox ("boolCaracterePrecedent : " & boolCaracterePrecedent)
EndIf

If MyPos < (Len(strMyHtml) - Len(qr!IngredientPluriel) + 1)Then
'JE RELEVE LE CARACTERE JUSTE APRES
strCaractereSuivant = Mid(strMyHtml, MyPos + Len(qr!IngredientPluriel), 1)
SelectCase strCaractereSuivant
Case" ", ".", "!", "?", ":", ";"
boolCaractereSuivant = True
CaseElse
boolCaractereSuivant = False
EndSelect
MsgBox ("strCaractereSuivant : " & strCaractereSuivant)
MsgBox ("boolCaractereSuivant : " & boolCaractereSuivant)
EndIf
If(MyPos 1Or boolCaracterePrecedent True)And((MyPos = Len(strMyHtml) - Len(qr!IngredientPluriel) + 1)Or boolCaractereSuivant = True)Then
MsgBox ("Je suis dans le IF THEN ELSE")
IngredientRemplace = ""If qr!Bold 1Then IngredientRemplace ""If qr!Underline 1Then IngredientRemplace IngredientRemplace + ""
If qr!Color <> 0Then IngredientRemplace = IngredientRemplace + " & StrColor & ">"
IngredientRemplace = IngredientRemplace + qr!IngredientPluriel
If qr!Color <> 0Then IngredientRemplace = IngredientRemplace + ""If qr!Underline 1Then IngredientRemplace IngredientRemplace + ""If qr!Bold 1Then IngredientRemplace IngredientRemplace + ""
strMyHtml = Replace(strMyHtml, qr!IngredientPluriel, IngredientRemplace)
MsgBox ("strMyHtml : " & strMyHtml)
EndIf
qr.MoveNext
'MsgBox (IngredientRemplace)
Wend
qr.Close

Le code ci-dessus me sors vraiment par les oreilles !
0
Rejoignez-nous