Supprimer les espaces, sauf ceux entre guillemets.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 976 fois - Téléchargée 30 fois

Contenu du snippet

Ce code supprime tout les espaces d'une chaine, saufe ceux entre deux '.
Par exemple :
>>Ma phrase à tester 'on ne supprime plus les espaces' et on les resupprime<<
donne :
>>Maphraseàtester'on ne supprime plus les espaces'etonlesresupprime<<

Pratique pour qui veut écrire un compilateur ou un interpréteur. C'est ma première source, donc c'est assez basique, je sais !
Note : ce code n'utilise pas l'instruction replace, en hommage au utilisateur de vb5 !

Source / Exemple :


'// On apelle la fonction avec :
'// ChaineFinale = DeleteSpace(ChaineDeDepart)

Function DeleteSpace(MaChaine As String) As String

Dim NextSpace
Dim BeginAt
Dim nbrG
Dim NextG
Dim LastG
Dim TestPair
Dim TestPair2

BeginAt = 1
LastG = 1

'// Boucle :
begin:
nbrG = 0
LastG = 1

 '// On recherche l'espace :
     NextSpace = InStr(BeginAt, MaChaine, " ")
     If NextSpace = 0 Then Goto ChaineModifie
     BeginAt = NextSpace + 1

 '// On recherche le nombre total de ' avant l'espace :

 '// Si le nombre est impair (sauf 0), on ne supprime pas l'espace, sinon on le
 '//supprime :

nextgFind:

      NextG = InStr(LastG, MaChaine, "'")
          If NextG = 0 Then
               GoTo PhaseSuivante
          Else
               LastG = NextG
               nbrG = nbrG + 1
               GoTo nextGFind
          End if

PhaseSuivante:

  '// On suprime l'espace si le nombre est pair ou = à 0 :
       If nbrG = 0 Then Goto DeletActual
       TestPair = nbrG / 2
       TestPair2 = Int(TestPair)
       If TestPair = TestPair2 Then
DeletActual:
               MaChaine = Left(MaChaine, Nextpace - 1) & Right(MaChaine, Len(MaChaine) - NextSpace)
       End If
'// On Recommence :
Goto begin

'// Une fois la fonction terminée :
ChaineModifie:
DeleteSpace = MaChaine

End Function

Conclusion :


--- Oulàla ! il y avait une errure sur cette source ! La voici corrigée ! ---
Je ne crois pas qu'il n'y ai de bugs sur cette source (à moins d'un problème dans le recopiage). Néamoins, vous pouvez m'envoyez vos commentaires à : scalpweb@hotmail.com.
Merci. @+ et bonne prog !

A voir également

Ajouter un commentaire

Commentaires

Vb Lover
Messages postés
221
Date d'inscription
vendredi 30 novembre 2001
Statut
Membre
Dernière intervention
13 février 2010
3 -
Effectivement, petite faute de recopiage ("Nextpace") mais bon..
Sinon : j'ai essayé
DeleteSpace "salut' 'la companie !"
mais ça boucle infini...

Je pense qu'une version récursive irait bien :
(l'appel est : DeleteSpace("Mon texte",true)

Function DeleteSpace(MaChaine As String, Efface As Boolean) As String
Dim S1 As String, S2 As String
Dim Eff As Boolean

If MaChaine = "" Then Exit Function

Eff = Efface
S1 = Left(MaChaine, 1)
S2 = Right(MaChaine, Len(MaChaine) - 1)
Select Case S1
Case "'": Eff Not Efface: S1 ""
Case " ": If Eff Then S1 = ""
End Select
DeleteSpace = S1 & DeleteSpace(S2, Eff)

End Function
Scalpweb
Messages postés
1468
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
5 mai 2010
-
En effet, ça bouclait à l'infini. Petit problème que j'ai résolu. Merci à vbLover. Je pense que ça doit marcher maintenant ! Désolé !
Renfield
Messages postés
17283
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
55 -
Ta fonction m'effraies, VbLover !!

Elle fonctionne, je ne dis pas le contraire....

Ce qui m'effraies le plus dans ta fonction, c'est le fait qu'elle soit récursive !!
Ca implique en fait un appel supplémentaire par caractère de ta chaine de départ...... c'est super gourmand, dis donc !!

Tu pourrais bien sur me répondre que vus les PC qu'ont a maintenant....... reste qu'il n'est pas interdit de chercher a optimiser ;)


Function DeleteSpace(ByRef MaChaine As String) As String
Dim i As Long
Dim Efface As Boolean
Dim Char As String * 1

For i = 1 To Len(MaChaine)
Char = Mid$(MaChaine, i, 1)
Select Case Char
Case "'"
Efface = Not Efface
Case " "
If Not Efface Then
DeleteSpace = DeleteSpace & Char
End If
Case Else
DeleteSpace = DeleteSpace & Char
End Select
Next i
End Function

Voici ce que j'aurais fait...

Ca fonctionne aussi, mais c'est moins gourmand (et plus rapide, je pense aussi ;) )

A bon entendeur.....
Vb Lover
Messages postés
221
Date d'inscription
vendredi 30 novembre 2001
Statut
Membre
Dernière intervention
13 février 2010
3 -
J'avais pas envie de faire de boucles ...
Non, en fait, j'ai 2 (petites excuses) :
1) je me suis mis à Lisp, et tout ce fait récursivement (en principe)
2) je pensais appeler récursivement ma fonction pas pour chaque caractère, mais pour chaque espace :

Function DeleteSpace(MaChaine As String, Efface As Boolean) As String
Dim N1 As Integer, N2 As Integer
Dim S1 As String, S2 As String
Dim Eff As Boolean

N1 = InStr(MaChaine, " ")
N2 = InStr(MaChaine, "'")

S1 = ""
Eff = Efface

If (0 < N1 And N1 < N2) Or N2 = 0 Then
If Not Efface Then S1 = " "
Else
Eff = Not Eff
N1 = N2
End If
S1 = Left(MaChaine, N1 - 1) & S1
S2 = Right(MaChaine, Len(MaChaine) - N1)
If S2 <> "" Then S1 = S1 & DeleteSpace(S2, Eff)

DeleteSpace = S1

End Function


Voilà, c'est moins gourmand. Et pour des textes de 10 mots de toute façon ... :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.