IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Regex pour extraire sous-chaîne dans une ligne de texte multiligne


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Regex pour extraire sous-chaîne dans une ligne de texte multiligne
    Bonjour,

    Je ne sais si je dois poster dans le forum dédié regex php ou celui-ci, car ma question est générale mais plutôt VB.net

    Je dois parcourir un fichier gedcom (standard d'échange pour les généalogistes) dont voici un extrait où je dois extraire des lieux de naissance et/ou décès :

    0 @1I@ INDI
    1 NAME Elisabeth/TOTO/
    1 SEX F
    1 BIRT
    2 TYPE Naissance
    2 DATE 18 JUL 1816
    2 PLAC ville1 test
    1 DEAT
    2 TYPE Décès
    2 DATE 18 JUL 1816
    2 PLAC ville 2
    1 CHAN
    2 DATE 19 APR 2004

    il me faut trouver une expression qui capture le lieu de naissance (ville1 test) et une autre similaire qui extrait le lieu de décès (ville 2). L'ennui est que d'un individu à l'autre, on peut avoir deux lieux comme dans l'exemple, ou un seul lieu, ou 0 lieu (quand il n'y a pas de lieu, il n'y a pas la ligne). J'ai trouvé plusieurs formules d'expression qui trouvent le lieu quand il n'y en a qu'un seul, mais je ne trouve pas la bonne expression qui donne un lieu de naissance, vide, quand il n'y a pas la ligne idoine, car s'il y a le lieu de décès et point celui de naissance, mon expression capture la date de décès comme étant la date de naissance (mais quand même l'autre expression de décès capture bien la date de décès!)

    L'expression que j'ai trouvée est

    (?:1 BIRT[\w\W]+?2 PLAC\s+)([^$]+?)\s*$

    avec les options ignorecase et multiline

    en outre, bien que cette expression trouve le lieu de naissance (quand il y est) en testant sur les sites regex101.com et www.myregextester.com, avec mon programme en vb 2010, ça attrape toujours le lieu de décès!

    Je cherche une solution avec un lookbehind qui voudrait interdire de prendre une ligne 2 PLAC si elle est précédée d'une ligne 1 DEAT mais celle ci-après ne fonctionne pas :

    (?:1 birt[\w\W]+?(?<!1 deat)[\w\W]+?2 plac\s+)([^$]+?)$

    Donc, j'aurai besoin de quelques lumières ou solution svp.

    Merci par avance

  2. #2
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Premièrement, je ne suis pas certain d'avoir vraiment tout compris
    Secondement, je ne suis pas convaincu que les expressions rationnelles soient la voie la plus adaptée ; peut-être qu'un parseur lisant le fichier et le transformant en une structure objet (par exemple Person avec une propriété BirthInfo qui est un sous-objet [potentiellement Nothing] qui possède entre autres la ville de naissance)

    Néanmoins ; j'ai peut-être ceci qui semble fonctionne d'après ma compréhension du problème https://regex101.com/r/sQ1aP5/2 à noter que je récupère également dans un groupe s'il s'agit d'une ville de naissance ou de décès comme ça c'est simple à déterminer côté code.

    Après si j'ai rien pigé...
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci pour ce premier commentaire.

    Créer un objet individu est justement ce que fait mon programme qui lit ce fichier gedcom et décode chaque dizaine (environ) de lignes.

    L'autre solution conseillée, serait d'employer des fonctions instr() qui décortiquent chaque ligne et essaient de ranger les données selon le sens des lignes précédentes. C'est faisable, mais pourquoi se priver de la force des expressions régulières qui font l'extraction en une seule ligne.

    Mon programme nomme "record" la dizaine de lignes qui concerne soit un individu, soit un mariage, xf la classe objet individu et j'ai juste à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            pattern = "(?:1 birt[\w\W]+?2 PLAC\s+)([^$]+?)\s*$"
            reLn = New Regex(pattern, RegexOptions.IgnoreCase Or RegexOptions.Multiline)
           If reLn.IsMatch(record) Then
            <div style="margin-left:40px">xf.ln = reLn.Match(record).Groups(1).Value</div>                    
          End If
    Je donne deux autres versions de présentation d'un "record"

    0 @2I@ INDI
    1 NAME x/TOTO/
    1 SEX M
    1 BIRT
    2 TYPE Naissance
    2 DATE 18 JUL 1816
    1 DEAT
    2 TYPE Décès
    2 DATE 18 JUL 1950
    2 PLAC ville 3

    0 @3I@ INDI
    1 NAME zz/TOTO/
    1 SEX F
    1 BIRT
    2 TYPE Naissance
    2 DATE 1816
    2 PLAC ville4
    1 DEAT
    2 TYPE Décès
    2 DATE 18 JUL 1816

    Ces deux exemples ne posent pas de problème puisqu'il y a une seule ligne 2 PLAC, l'expression régulière ne peut pas se tromper de ligne puisqu'il n'y en a qu'une.

    C'est le premier exemple qui pose problème quand il y a deux lignes 2 PLAC car à cause du phénomène greedy des expressions, il est difficile de les faire s'arrêter quand elles ont trouvé un premier résultat. En l'espèce, je cherche à au moins les faire s'arrêter en fin de la ligne 2 PLAC cherchée, mais ça ne fonctionne pas, c'est pourquoi je cherche comment distinguer les deux lignes au moyen du lookbehind du texte 1 DEAT qui ne concerne que le bloc décès.

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Soit j'ai de nouveau rien pigé ; soit mon expression rationnelle fonctionne pour tous les cas présentés

    Sur un autre plan ; tu devrais éviter de faire regex.IsMatch puis regex.Match ça fait 2 fois le même boulot ; autant directement faire regex.Match et tester sa propriété Success.
    Mon approche est sans doute plus adaptée pour utiliser regex.Matches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Dim rgx As New Regex("(?ims)1 (BIRT|DEAT).+?2 PLAC (.+?$)")
     
    Dim sample = """0 @1I@ INDI
    1 NAME Elisabeth/TOTO/
    1 SEX F
    1 BIRT
    2 TYPE Naissance 
    2 DATE 18 JUL 1816
    2 PLAC ville1 test 
    1 DEAT
    2 TYPE Décès
    2 DATE 18 JUL 1816
    2 PLAC ville 2
    1 CHAN 
    2 DATE 19 APR 2004
     
    0 @2I@ INDI
    1 NAME x/TOTO/
    1 SEX M
    1 BIRT
    2 TYPE Naissance 
    2 DATE 18 JUL 1816
    1 DEAT
    2 TYPE Décès
    2 DATE 18 JUL 1950
    2 PLAC ville 3
     
    0 @3I@ INDI
    1 NAME zz/TOTO/
    1 SEX F
    1 BIRT
    2 TYPE Naissance 
    2 DATE 1816
    2 PLAC ville4 
    1 DEAT
    2 TYPE Décès
    2 DATE 18 JUL 1816"""
     
    For Each match As Match In rgx.Matches(sample)
        Console.WriteLine($"{match.Groups(1)} : {match.Groups(2)}")
    Next
     
    ' Output :
    'BIRT : ville1 test
    'DEAT : ville 2
    'BIRT : ville 3
    'BIRT : ville4
    Là il n'y a pas de distinction des différents "record" comme tu les appelles ; mais j'ai supposé que cela était géré en amont du problème actuel
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Arrggh, à première vue, la méthode me paraît géniale, on capture les deux lignes (s'il y en a deux), et on fait la distinction ensuite grâce à leur marqueur (Birt, Deat).

    J'ai fait le test dans mon site online favori regex101 et j'étais d'abord content car ça fonctionnait avec le premier record. Je fais le test dans mon programme et ça ne fonctionne pas grrr.. J'ai cru un instant que c'était mon programme qui supprimait peut-être les retours de ligne car je lis le fichier avec ReadAllText, mais non, j'ai parcouru tous les codes caractères jusqu'à la fin d'une ligne 2 PLAC ville et il y a bien un \r\n. Alors sur mon site en ligne je fais le test avec le 2ème record et là il y a une erreur car le lieu détecté pour BIRT est ville 3, alors qu'il n'y a pas de ligne 2 Plac sous la ligne 1 Birt et que 2 plac ville 3 est sous la ligne 1 Deat.

    Donc pour le 2 ème record, on doit avoir DEAT ville 3 et pas de match pour BIRT

    Il faut donc ne pas faire de match si après 1 BIRT, on trouve la ligne 1 DEAT (ou rien) sans avoir trouvé de ligne 2 PLAC

    On y est presque? J'ai vu que dans certains langages regex, on peut insérer une fonction if valeur à tester, résultat si vrai, résultat si faux. Est-ce que ça existe en VB.net?

    Merci pour le tuyau du match.success, j'ai modifié mon code, bien que le temps ne soit pas trop gênant car mon programme met 14 secondes à traiter un fichier de 1,3Mo

    Demain, je pars dans un territoire où il n'y a pas d'Internet par ligne fixe! donc ne pourrai pas lire les réponses avant une semaine!

    Merci encore

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    ouf, je pense avoir trouvé une bonne solution.

    pour le pattern lieu de naissance, j'ai

    (?ims)1 BIRT.+?(?(?=1 deat)(?<true>)|2 plac\s(?<false>.+?)\s*$)

    pour le lieu de décès, c'est plus simple,( mais si un jour le lieu de décès se trouve avant la ligne de naissance, il faut se protéger pareil)

    1 DEAT[\w\W]+?2 PLAC\s+([^\n\r]+)

    (pour les tests, j'ai nommé les groupes pour voir ceux qui agissent, on peut enlever les noms plus tard).

    Reste à combiner les deux patterns en un comme sait le faire Sehnsucht (par nostalgie... de la simplification...)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    me revoilà dans le monde moderne!

    J'ai trouvé un beau pattern qui fonctionne sur regex101.com ...mais pas sur VB 2010!

    (?ims)^1 (?<typ>\w{3,4})\s*(?(?!2)(?<val>.+?$)|(?:.+?$))?(?:\n2 date (?<dat>.+?$))?(?:\n2 plac (?<pl>.+?$))?

    Sur regex.com, il faut que je règle avec gims pour que ce soit suffisamment greedy, par contre avec VB 2010, c'est trop greedy et complication supplémentaire, dans un gedcom nouveau, je trouve des lignes 2 AGE 17 derrière une ligne 2 DATE 1900 par exemple dans la partie décès, pour indiquer l'âge au décès. Or VB 2010 et mon pattern sont trop greedy, tellement que ça prend 17 comme date de décès!

    Finalement, je me suis contenté de ce pattern
    (?ims)^1 (?<typ>[^\s]+)\s\n?(?<rec>[\w\W]+?)\s*\n(?:(?=^1)|$)

    qui découpe un record en champs 1 xx ou 2 xx et met dans un groupe nommé rec, la valeur du champ, comme cela, je n'ai plus qu'à faire une boucle For Each
    pour mémoriser chaque valeur ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
        reAll="(?ims)^1 (?<typ>\w{3,4})\s*(?(?!2)(?<val>.+?$)|(?:.+?$))?(?:\n2 date (?<dat>.+?$))?(?:\n2 plac (?<pl>.+?$))?"
        reNom = New Regex("(?i)(.*)\/(.*)\/")
        reLnLd = New Regex("(?ims)2 plac\s([^\r\n]+)\r?\n?")
        reLnLd = New Regex("(?ims)2 DATE\s(.+?)\r*$")
     
        For Each match As Match In reAll.Matches(record)
                        If match.Groups(1).Value = "NAME" Then
                            mymatch = reNom.Match(match.Groups(2).Value)
                            If mymatch.Success Then
                                xf.fa = mymatch.Groups(2).Value
                                xf.pr = mymatch.Groups(1).Value
                            Else
                                xf.fa = "?"
                            End If
                        End If
                        If match.Groups(1).Value = "SEX" Then
                            xf.sx = If(UCase$(match.Groups(2).Value) = "M", "H", If(match.Groups(2).Value = "", "", "F"))
                        End If
                        If match.Groups(1).Value = "BIRT" Then
                            xf.dn = Conv_ged_dat(reDnd.Match(match.Groups(2).Value).Groups(1).Value)
                            xf.ln = reLnLd.Match(match.Groups(2).Value).Groups(1).Value
                        End If
                        If match.Groups(1).Value = "DEAT" Then
                            xf.dd = Conv_ged_dat(reDnd.Match(match.Groups(2).Value).Groups(1).Value)
                            xf.ld = reLnLd.Match(match.Groups(2).Value).Groups(1).Value
                        End If
                        If match.Groups(1).Value = "NOTE" Then
                            xf.note = Replace(match.Groups(2).Value, ";", "|")
                        End If
                        If match.Groups(1).Value = "OCCU" Then
                            xf.note = xf.note & match.Groups(2).Value
                        End If
                        If match.Groups(1).Value = "FAMC" Then
                            xf.mp = match.Groups(2).Value.Replace("@", "")
                        End If
              Next
    enfin, petite question pratique sur les groupes nommés, je connais la syntaxe pour nommer un groupe dans un pattern, mais comment récupérer ensuite ce groupe dans le match,
    et il serait temps que je donne des explications sur la structure d'un "record" de gedcom :
    - un record (appellation personnelle) est un groupe de lignes qui définit soit un individu, soit un mariage, le début de groupe est repéré par une ligne 0 xxx
    - c'est ensuite découpé en niveaux et sous niveaux
    - les niveaux 1 xxx décrivent par exemple, le nom (1 NAME...), un événement (naissance : 1 BIRT....), décès (1 DEAT...), le sexe (1 SEX M ou F)(!)
    - les niveaux 2 xxx donnent les valeurs des événements de niveau 1, la date avec 2 DATE, un lieu avec 2 PLAC

    ensuite on recommence avec une ligne 0 xxx pour l'individu ou mariage suivant.

    etc...

    Merci bien

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Bonjour à nouveau,
    Humh, j'ai un nouveau problème avec des "records" où les champs 1xx sont vides, dans ce cas, ça prend le champ 1xx suivant comme une valeur du premier qui est vide.
    Voici le cas :
    4I@ INDI
    1 NAME Prénom Père/PERE/
    2 GIVN Prénom Père
    2 SURN PERE
    1 SEX M
    1 BIRT
    1 DEAT
    2 DATE ABT APR 1807
    2 PLAC Lieu1,,,,,
    1 FAMS @15U@
    1 NCHI 2
    1 NMR 1

    j'ai trouvé une solution avec ce pattern
    (?ims)^1 (?<typ>[^\s]+)(?:\n|\s)(?<rec>.*?(?=^1)|.+?$)

    mais nouveau petit problème, dans les valeurs en résultat, il y a des espaces parasites en fin de valeur, par exemple "@15U@ "
    C'est dû au fait que le pattern <rec> prend tous les caractères (.*?) jusqu'à ce qu'il rencontre un 1 en début de ligne ou un dernier caractère en fin de texte (ceci pour récupérer le 1 NMR qui n'est pas suivi d'un 1 en début de ligne).
    Cette méthode prend les fins de ligne et les remplace par des espaces!
    Je cherche donc une solution pour que <rec> avale tout jusqu'au ^1 suivant, en ayant un filtre qui élimine les fin de ligne.
    En attendant, je fais un trim et je vais voir avec un split sur un pattern ^1.*?\n

    Merci par avance

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    oup, en fait c'est mieux avec un split préalable avec un pattern ^1\s ainsi
    Regex.Split(record, "(?ims)^1 ")

    je récupère bien dans chaque split, un groupe de lignes comprenant le type en première ligne et les valeurs en lignes suivantes
    pour le premier groupe :

    NAME Prénom Père/PERE/
    2 GIVN Prénom Père
    2 SURN PERE

    pour le deuxième groupe :
    SEX M

    etc...
    Cependant, en appliquant un pattern
    "(?ims)(?<typ>[a-z]+)[\s\n](?<rec>.*)"

    sur chaque split, les valeurs du groupe rec contiennent un espace à la fin, par exemple
    SEX M donne "M " comme valeur

    J'ai donc toujours la même question, comment récupérer une ou plusieurs lignes sans que les retours lignes produisent un espace.

    merci

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    En fait, la présence de vbcrlf en fin de ligne est inhérente à la méthode de lecture que j'ai utilisée : File.ReadAllText
    Pour éliminer ces vbcrlf, il faut soit faire un replace préalable (mais alors plus de repère de fin de ligne!), soit utiliser la méthode File.ReadAllLines, mais alors les données se retrouvent dans une array et plus possible d'utiliser les regex pour faire une recherche multilignes!

    Voilà ce que j'ai réussi pour le moment, (ensuite je vais mettre au point une méthode pour analyser l'array créée par ReadAllLines qui me semble plus rapide!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
            pattern = "(?i)([\w\d]+)\s*@\s*INDI"
            reIndi = New Regex(pattern)
     
            pattern = "(?i)([\w\d]+)[\s]*@\s*FAM"
            reFami = New Regex(pattern)
     
            pattern = "(.*)\/(.*)\/"
            reNom = New Regex(pattern)
     
            pattern = "(?is)(?<typ>[a-z]+)[\s\n]+(?<rec>.*)[\n\r]{0,2}"
            reAll = New Regex(pattern)
     
            pattern = "(?im)2 plac\s(.*?)[\n\r]+"
            reLnLd = New Regex(pattern)
            pattern = "(?im)2 DATE\s(.*?)[\n\r]+"
            reDnd = New Regex(pattern)
     
            'Read the file into buf2
            buf2 = File.ReadAllText(strfilename, System.Text.Encoding.GetEncoding(1252))
            buf1 = Regex.Split(buf2, "0\s+@\s*")
            buf2 = ""
     
            'parse buf1 to detect indi or fami records
            For i As Integer = 1 To UBound(buf1)
                record = buf1(i)
                'look for indi record
                '0 @2I@ INDI
                '1 NAME /ARNAUD/
                '2 SURN ARNAUD
                '1 SEX F
                '1 BIRT
                '2 Type Naissance
                '2 DATE ABT 1836
                '1 FAMS @5537U@
                '1 FAMC @5536U@
                '1 NCHI 1
                '1 NMR 1
                ' indis are reordered in progressive ordinal numbering starting from y1=1
                If (reIndi.IsMatch(record)) Then  'test if found indi
                    xf = New xindi
                    fields1 = Regex.Split(record, "(?ims)^1 ")
                    For j As Integer = 1 To UBound(fields1)
                        For Each match As Match In reAll.Matches(fields1(j))
                            typ = match.Groups("typ").Value
                            rec = match.Groups("rec").Value
                            Select Case typ
                                Case "NAME"
                                    mymatch = reNom.Match(rec)
                                    If mymatch.Success Then
                                        xf.fa = mymatch.Groups(2).Value
                                        xf.pr = mymatch.Groups(1).Value
                                    Else
                                        xf.fa = "?"
                                    End If
                                Case "SEX"
                                    xf.sx = If(rec.Trim() = "M", "H", If(rec = "", "", "F"))
                                Case "BIRT"
                                    xf.dn = reDnd.Match(rec).Groups(1).Value
                                    xf.ln = reLnLd.Match(rec).Groups(1).Value
                                Case "DEAT"
                                    xf.dd = reDnd.Match(rec).Groups(1).Value
                                    xf.ld = reLnLd.Match(rec).Groups(1).Value
                                Case "NOTE"
                                    xf.note = xf.note & Regex.Replace(rec, ";\n|;|\s$", "")
                                Case "OCCU"
                                    xf.note = xf.note & Regex.Replace(rec, ";\n|;|\s$", "")
                                Case "FAMC"
                                    xf.mp = Regex.Replace(rec, "@|\s$", "")
                            End Select
                        Next
                    Next
    A suivre...

Discussions similaires

  1. RegEx pour extraire les liens d'une page html
    Par herch dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 13/05/2009, 17h26
  2. Réponses: 16
    Dernier message: 10/01/2008, 15h12
  3. [RegEx] Sous-chaîne dans une sous-chaîne : optimisation RegExp
    Par mathieugamin dans le forum Langage
    Réponses: 3
    Dernier message: 17/12/2007, 08h44
  4. Réponses: 1
    Dernier message: 18/04/2007, 17h07
  5. Réponses: 28
    Dernier message: 22/09/2005, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo