Regex : trouver un ; non précédé par un \

Misange

XLDnaute Barbatruc
Hello joyeux vivants de la nouvelle ère,

Si un spécialiste des regex passe par là, peut-il (elle !) m'indiquer comment rechercher un point virgule qui ne soit pas précédé par un antislash ? Les regex je dis toujours que je m'y mets mais force est de constater que je ne suis vraiment pas au point.
Merci++ !
 

david84

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

Bonjour Misange,
regarde ici au paragraphe des assertions complexes (le point 9 du paragraphe G) et sur l'utilisation de l'assertion avant négative ( le (?!) ).
Si tu ne t'en sors pas, mets un petit fichier exemple avec les résultats attendus et je regarderai ce que je peux te proposer.
A+
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

Salut David

Dans le cadre de la mise à jour d'excelabo (changement de version de drupal, répartition différentes des pages dans les menus...), j'ai récupéré dans un classeur excel les tables de données de la version actuelle du site. J'ai fait des tas de modifs et je dois réinjecter dans la nouvelle base de données les tables modifiées. Il faut pour cela que j'échappe certains caractères. Visiblement certains ont justement échappé à la sagacité et aux multiples rechercher remplacer que j'ai pu faire. D'où mon besoin de rechercher les ; qui ne soient pas des \;

Voici une phrase avec des ; certains sont précédés d'un caractère d'échappement \; d'autres non . Le but est de remplacer tous les ; par \; sans toucher aux \; (sinon j'obtiendrais \\; )

si je mets dans le rechercher remplacer
(?!\);
excel ne trouve rien dans la phrase.
 

Pièces jointes

  • regex.xlsx
    7.6 KB · Affichages: 67

david84

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

Re
teste ce motif pour commencer :
Code:
.Pattern = "[^\\];"
Ensuite, l'utilisation d'un replace (je parle de la méthode de l'objet REgExp, pas de la fonction VBA mais les 2 peuvent convenir) te permettra de remplacer les correspondances trouvées par "\;"
Pour l'assertion avant négative, je vais regarder.
A+
Edit : fonction faite vite fait, donc pas testé (seulement sur ton unique exemple) :
Code:
Function TestCar(c As String) As String
Dim oRegExp As Object, matches As Object
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
    .Global = True
    .Pattern = "[^\\];"
    If .test(c) Then
        Set matches = .Execute(c)
        TestCar = .Replace(c, "\;")
    End If
End With
End Function
Mais peut-être que dans ton cas une sub serait plus adaptée (à toi de me dire).
 

david84

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

Re
suite du message #5 : tu recherches en fait une assertion arrière négative et non une assertion avant négative.
Or, ce type d'assertion n'est pas gérée avec la version VBA.
De plus, ta syntaxe (?!\); n'est pas bonne :
pour rechercher par exemple les correspondances où le \ n'est pas suivi par un ; tu pourrais utiliser le motif
Code:
.Pattern = "\\(?!;)"
Mais dans ton cas, ce n'est pas ce type de motif qu'il te faut utiliser, d'où ma proposition du message #5.
A+
 

Modeste geedee

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

Bonsour®
Voici une phrase avec des ; certains sont précédés d'un caractère d'échappement \; d'autres non . Le but est de remplacer tous les ; par \; sans toucher aux \; (sinon j'obtiendrais \\; )

si je mets dans le rechercher remplacer
(?!\);
excel ne trouve rien dans la phrase.

:rolleyes:
peut-etre commencer par remplacer "\;"
par un caractère rare ( ex : alt 0254 ="þ")

procéder ensuite au remplacement de ";" par "\;"
puis terminer par restituer "þ" par "\;"
:cool:
 

PMO2

XLDnaute Accro
Re : Regex : trouver un ; non précédé par un \

Bonjour,

Une piste avec le code suivant
Code:
Sub PointVirg2BackSlashPointVirg()
Dim S As Worksheet
Dim R As Range
Dim var
Dim i&
Dim j&
Dim k&
Dim A$
Dim B$
Dim T()
If TypeName(Selection) <> "Range" Then
  MsgBox "Il faut sélectionner une plage de cellules"
  Exit Sub
End If
If Selection.Cells.Count = 1 Then
  MsgBox "Il faut sélectionner au moins 2 cellules (même si vide)"
  Exit Sub
End If
var = Selection
ReDim T(1 To UBound(var, 1), 1 To UBound(var, 2))
For i& = 1 To UBound(var, 1)
  For j& = 1 To UBound(var, 2)
    A$ = CStr(var(i&, j&))
    If A$ = "" Then Exit For
    For k& = 1 To Len(A$)
      If Mid(A$, k&, 1) = ";" Then
        If k& = 1 Then
          B$ = "\;"
        Else
          If Mid(A$, k& - 1, 1) <> "\" Then
            B$ = B$ & "\;"
          Else
            B$ = B$ & Mid(A$, k&, 1)
          End If
        End If
      Else
        B$ = B$ & Mid(A$, k&, 1)
      End If
    Next k&
    T(i&, j&) = B$
    B$ = ""
  Next j&
Next i&
Sheets.Add
Set S = ActiveSheet
Set R = S.Range(S.Cells(1, 1), S.Cells(UBound(var, 1), UBound(var, 2)))
R = T
End Sub
 

Bebere

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

bonjour
une autre proposition
pas géré \\;
Code:
Sub test()
    Dim x As String, tbl, i As Long

    [A3] = ""
    tbl = Split([A2], ";", -1, 1)
    'pour voir comment cela se présente
    'For i = 0 To UBound(tbl)
    'Range("A" & i + 10) = tbl(i)
    'Next i
    For i = 0 To UBound(tbl)
        x = Right(tbl(i), 1)
        Select Case x
        Case "\"
            If [A3] = "" Then [A3] = tbl(i) & ";" Else [A3] = [A3] & tbl(i) & ";"
        Case Else
            If [A3] = "" Then [A3] = tbl(i) & "\;" Else [A3] = [A3] & tbl(i) & "\;"
        End Select
    Next i

End Sub
 

Misange

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

Hello et bonne année

Merci à tous pour vos réponses.
C'est bien ce que je craignais avec les regex : difficile de faire des "assertions arrières négatives" ('tain ca en jette !) . MA question portait sur les ; mais c'est vraiment le principe qui m'intéresse. A force de faire des rechercher remplacer, ça devient ... curieux, bizarre (ingérable ? qui a dit ingérable ? :( )
J'espérais mettre en ligne la nouvelle version le 1/1. C'est rapé, j'ai encore un paquet de boulot... J'y retourne !
 

david84

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

Bonsoir,
que donne le motif que je t'avais proposé sur ton unique exemple ?
Si tu mets un fichier avec plusieurs exemples tous explicites, je peux peut-être te proposer un motif plus abouti mais là avec un seul exemple, c'est compliqué.
A+
 

Misange

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

Bonsoir David
En fait... je suis passée par notepad++, c'était plus simple. Ce pb là est résolu maintenant je m'attaque à corriger des erreurs que j'ai introduites en en corrigeant d'autres :).

Mais bon je viens de faire un grand pas pour résoudre un pb de structure de la nouvelle version alors je suis contente, j'avance :). Je jongle entre le VBA et le PHP : ça se ressemble sans être pareil et je fais plein d'erreurs dans l'un puis dans l'autre. Pas bon les mélanges, on ne cesse de le répéter pourtant en ces jours de festivités !
 

MJ13

XLDnaute Barbatruc
Re : Regex : trouver un ; non précédé par un \

Bonjour à tous

Et avec une macro faite avec Henry, cela fonctionnerait-il ?

Code:
  Selection.Replace What:="\\;", Replacement:="\;", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="\;", Replacement:=";", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:=";", Replacement:="\;", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
 

Discussions similaires

Statistiques des forums

Discussions
312 202
Messages
2 086 180
Membres
103 152
dernier inscrit
Karibu