Une regex java pour extraire un mot dans une chaine

Signaler
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020
-
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
-
Bonjour,
Mes chaines sont de la forme :
"1 FORM Town , Area code , County , Region , Country, SubdivisionTour
2 FOO Pli , Tour"

Peut on extraire avec un RegEx Java
Q1 - "Town" exclusivement

Q2 - "Town Country"" ou mieux "Town - Country" (avec le séparateur "-")

Merci a celui (ceux) qui m'aide(ent)
Salutations

12 réponses

Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Bonjour

je ne code pas en Java et je n'ai pas particulièrement cherché de site de regex en ligne dédié à Java (les implémententations changent d'un langage à l'autre).

Sur ce site (lien à copier coller)
http://regexstorm.net/tester?p=%28%3f%3c%3d1+FORM+%29%5cb%28%3f%3ctown%3e%5cw%2b%29%5cb+%2c.%2b%3f%2c+%5cb%28%3f%3ccountry%3e%5cw%2b%29%5cb&i=1+FORM+Town+%2c+Area+code+%2c+County+%2c+Region+%2c+Country%2c+SubdivisionTour%0d%0a2+FOO+Pli+%2c+Tour


Je t'ai mis un exemple de capture avec 2 groupes nommés "town" et "country".
Tu n'as plus qu'à concatener les 2 groupes pour obtenir ce que tu veux.
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Bonjour,
Merci d'abord de ta réponse... mais je ne comprends pas ..
1/ Ta réponse
Je copie et colle ton lien où ?
.
2/ Extraire "country"
Je cherche un pattern permettant d'extraire "country" de la chaine J'ai testé "(?ms).*^\d\sFORM\s([^,]*),.*$", "(?ms).*^\d\sFORM\s(([^,]*,){4}).*$" et bien d'autres écritures mais je ne parviens pas au résultat "country" exclusivement
Q1 - Quelle est la Regex qui permet d'extraire "country"

2/ Extraire en une fois "town - country" avec (ou sans) le caractère intermédiaire"-". Dans ce cas "town - country" sont assemblés (et seront traité dans mon logiciel exterrne).

Q2 - Quel est donc le code correct pour extraire en une chaine "town country" (assemblés) ?

Merci beaucoup d'avance
Salutations
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Bonjour
Un lien c’est une adresse internet, donc tu la colles dans la barre d’adresse de ton navigateur.
Quand tu l’aurais fait, on en reparle
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Bonjour depuis la cote Basque,
Merci beaucoup de m'aider

Q1 - Extraire "Country"
J'ai testé ton lien (ta Regex), elle sélectionne "Town , Area code , County" je ne veux que "county" .. faisons le test plutôt sur "Country" pour éviter les ambiguïtés si tu veux bien ...

J'ai écrit et testé "(?ms).*^\d\sFORM\s(([^,]*,){4}([^,]*)).*$" dans Regex101.com
Dans mon fichier la balise <FORM> est présente plusieurs fois c'est la raison de l'orthographe de ma Regex (pour être plus clair, je peux poster la chaine a tester complète, il s'agit d'un fichier Gedcom)

Cela fonctionne.. Quand je le teste dans <Notepad++ 7.85> cela ne fonctionne pas pourquoi ?

Q2 - Extraire "Town + Country" on en reparle après avoir résolu "Country" si tu veux bien.

A plus tard
Salutations
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Déjà dans ta première question tu as demandé town, pas country.
Mais passons.

En second tu as demandé town et country, c’est ce que je t’ai fourni.
Tu as town et tu as country donc tu en fais ce que tu veux.

Donc je recopie la fin de ma première réponse:
Je t'ai mis un exemple de capture avec 2 groupes nommés "town" et "country".
Tu n'as plus qu'à concatener les 2 groupes pour obtenir ce que tu veux.

C’est le mot groupe qui est important.
Évidemment si tu ne sais pas ce qu’est un groupe en regex, ça ne saute pas aux yeux.
Dans ce cas retourne sur regex storm et clique sur l’onglet « table ».
Tu verras que la ville et le pays sont extraits séparément.

Je ne sais pas comment, on récupère les groupes dans une capture en java, ni si java accepte les groupes avec des noms (si ça n’est pas le cas, il faudra utiliser les groupes numérotés)

Tu peux lire ce tuto, https://cyberzoide.developpez.com/tutoriels/java/regex/#LX notamment le chapitre X. Ce tuto date de 2004, à cette époque, il semble que les groupes n’avaient pas de noms, mais ça peut avoir changé depuis.

Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Re Bonjour,
Si tu veux bien reprenons

Ma chaine
"etc..

0 HEAD
2 PLAC sss,ss,ss,ss,ss,5 eme arrondissement
2 DATE 7 OCT 1956
1 GTO
2 PLAC Town , Area code , County , Region , Country, Subdivision
2 DATE 27 SEP 1856
0 @1I@ INDI
etc ..."
1/ Extraction de Date
La Regex <(?ms).*^\d\sDATE\s([^\r\n]*).*$> testée dans <Notepad+++> et <Regex101.com retourne le submatch "27 SEPT 1856" ... ce qui pour moi est correct...

2/ Extraction du champ "Town" exclusivement
De la meme manière la Regex <(?ms).*^\d\sPLAC\s([^,]*),.*$> testée dans <Notepad+++> et <Regex101.com retourne le submatch "Town" ... ce qui pour moi est correct...

3/ Extraction du champ "Country"
Maintenant, la RegEx <(?ms).*^\d\sPLAC\s(([^,]*,){4}).*$> testée dans <Notepad+++> plante.
testée dans <Regex101.com> retourne le submatch "Town," ... ce qui pour moi est incorrect... la virgule est incluse ...
Pour information, la Regex <(?ms).*^\d\sPLAC\s[^,]*,([^,]*),.*$> testée trouve "Area code" sans la virgule.
Pour information la Regex <(?ms).*^\d\sPLAC\s[^,]*,([^,]*),([^,]*),([^,]*),([^,]*),.*$> testée trouve les submatches "\1: Area code
\2: County
\3: Region
\4: Country
mais pas "Country" exclusivement

Question 1 - Quelle est la Regex précise extrayant "Town" exclusivement

On verra après pour extraire<Town + Country>
Tout cela est a utiliser dans le soft Yed que tu connais peut etre ....
Merci de ton aide
Salutations
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Non je ne connais pas Yed.
Mais:
  • ta question initiale est

Peut on extraire avec un RegEx Java
  • CodeS SourceS est un forum traitant de l'écriture de logiciels, notamment en Java


De ces constats, je suis parti du principe que tu es en train d'écrire ton propre logiciel en Java et donc qu'une fois obtenus les 2 groupes tu peux en faire ce que tu veux.

Cependant, il faut que tu comprennes que je ne suis ni dans ta tête, ni devant ton ordinateur, ce qui est évident pour toi ne l'ai pas pour moi et inversement.

Tu viens parler de Regex et de Java dans un forum de coding, pour moi il est évident que tu codes.
Maintenant, je pars du principe que non.

Si Yed ne peut pas extraire de groupes, alors évidement il faut faire autrement.
Par contre si il sait, on peut même écrire une seul regex pour la date, la ville et le pays. (j'utilise les mots français ça évitera des malentendus supplémentaires avec county et country).

Pour la date
(?<=DATE\s)\d{1,2}\s[A-Z]{3}\s\d{4}

Exemple
http://regexstorm.net/tester?p=%28%3f%3c%3dDATE%5cs%29%5cd%7b1%2c2%7d%5cs%5bA-Z%5d%7b3%7d%5cs%5cd%7b4%7d&i=0+HEAD%0d%0a2+PLAC+sss%2css%2css%2css%2css%2c5+eme+arrondissement%0d%0a2+DATE+7+OCT+1956%0d%0a1+GTO%0d%0a2+PLAC+Town+%2c+Area+code+%2c+County+%2c+Region+%2c+Country%2c+Subdivision%0d%0a2+DATE+27+SEP+1856%0d%0a0+%401I%40+INDI


Pour la ville
(?<=PLAC\s)[A-Za-z]+

exemple
http://regexstorm.net/tester?p=%28%3f%3c%3dPLAC%5cs%29%5bA-Za-z%5d%2b&i=0+HEAD%0d%0a2+PLAC+sss%2css%2css%2css%2css%2c5+eme+arrondissement%0d%0a2+DATE+7+OCT+1956%0d%0a1+GTO%0d%0a2+PLAC+Town+%2c+Area+code+%2c+County+%2c+Region+%2c+Country%2c+Subdivision%0d%0a2+DATE+27+SEP+1856%0d%0a0+%401I%40+INDI


Pour le pays
(?<=PLAC\s(?:.+?,){4}\s?)[A-Za-z]+(?=\s?,)

Exemple
http://regexstorm.net/tester?p=%28%3f%3c%3dPLAC%5cs%28%3f%3a.%2b%3f%2c%29%7b4%7d%5cs%3f%29%5bA-Za-z%5d%2b%28%3f%3d%5cs%3f%2c%29&i=0+HEAD%0d%0a2+PLAC+sss%2css%2css%2css%2css%2c5+eme+arrondissement%0d%0a2+DATE+7+OCT+1956%0d%0a1+GTO%0d%0a2+PLAC+Town+%2c+Area+code+%2c+County+%2c+Region+%2c+Country%2c+Subdivision%0d%0a2+DATE+27+SEP+1856%0d%0a0+%401I%40+INDI


Dans ton exemple, et seulement pour le pays, un coup y'a des espaces avec les virgules et un coup non, j'en ai tenu compte. Mais pas pour la date ou la ville.


Pour ton histoire de ville + pays si et seulement si
  • Yed te permet de travailler ligne par ligne
  • Yed sait faire des Replace

alors tu peux faire ça
Regex
\d\s?PLAC\s?([A-Za-z]+)\s?,(?:.+?,){3}\s?([A-Za-z]+).+

Replace
$1 - $2

Ce qui donne sur une seule ligne
http://regexstorm.net/tester?p=%5cd%5cs%3fPLAC%5cs%3f%28%5bA-Za-z%5d%2b%29%5cs%3f%2c%28%3f%3a.%2b%3f%2c%29%7b3%7d%5cs%3f%28%5bA-Za-z%5d%2b%29.%2b&i=2+PLAC+sss%2css%2css%2css%2css%2c5+eme+arrondissement&r=%241+-+%242


ou
http://regexstorm.net/tester?p=%5cd%5cs%3fPLAC%5cs%3f%28%5bA-Za-z%5d%2b%29%5cs%3f%2c%28%3f%3a.%2b%3f%2c%29%7b3%7d%5cs%3f%28%5bA-Za-z%5d%2b%29.%2b&i=2+PLAC+Town+%2c+Area+code+%2c+County+%2c+Region+%2c+Country%2c+Subdivision&r=%241+-+%242


Il faut cliquer sur l'onglet "Context" pour voir le résultat du remplacement.


Par sur le texte entier ça donne
http://regexstorm.net/tester?p=%5cd%5cs%3fPLAC%5cs%3f%28%5bA-Za-z%5d%2b%29%5cs%3f%2c%28%3f%3a.%2b%3f%2c%29%7b3%7d%5cs%3f%28%5bA-Za-z%5d%2b%29.%2b&i=0+HEAD%0d%0a2+PLAC+sss%2css%2css%2css%2css%2c5+eme+arrondissement%0d%0a2+DATE+7+OCT+1956%0d%0a1+GTO%0d%0a2+PLAC+Town+%2c+Area+code+%2c+County+%2c+Region+%2c+Country%2c+Subdivision%0d%0a2+DATE+27+SEP+1856%0d%0a0+%401I%40+INDI&r=%241+-+%242

Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Bonjour,
D'abord merci de tes réponses ... Je te mets beaucoup à contribution ....
Je précise mon exemple car j'ai commis des erreurs avec mon exemple et l'exposé du problème
J'ai un fichier texte de la forme ci dessous :

"etc..
...

0 @10@ INDI
1 BIRT
2 DATE 27 sept 1856
2 PLAC Ville , Région code , Conté , Region , Pays , Subdivision
0 @2I@ INDI
1 NAME Pierre Marie Georges/Mulé/
2 DATE 7 OCT 1956
1 OBJE
1 DEAT

2 PLAC s1s,s2s,s3s,,s5s,6 eme arrondissement

etc ..."
LE PROBLEME - MA DEMARCHE
Entre chaque balise "0 @XX@ INDI" je dois extraire des données date, Ville.
Dans un premier temps, je me positionne donc sur une balise "0 @XX@ INDI" puis je dois ensuite fournir un pattern Regex permettant d'extraire par exemple la Date, la Ville, le Pays des sous balises "2" qui suivent..
Dans un second temps, je me positionne sur la balise suivante "0 @XX@ INDI" et en utilisant un premier pattern je dois extraire la Date, entre les balises INDI qui suivent..
puis la Ville, le Pays entre les balises INDI qui suivent..

Je sais me positionner successivement sur les balises successives "0 @XX@ INDI"
Je ne sais pas écrire le pattern permettant d'extraire dans la balise "2 DATE xxxxxx" la date
dans la balise "2 PLAC Ville, ,,Pays,,,," la "Ville", le "Pays"

Pour la date
Dans mon exemple :
Ta Regex<(?<=DATE\s)\d{1,2}\s[A-Z]{3}\s\d{4}>
- dans <regex101.com> ne renvoie rien s'il n'y a pas un second "0 @XX@ INDI" et DATE
- dans <NotePad+++> renvoi matches "7 OCT 1956" pas de sub-Matches
- dans <RegexTester> ne renvoie rien s'il n'y a pas un second "0 @XX@ INDI" et DATE

donc ne convient pas parce que je t'ai mal exposé le problème.. mille excuses ...

Ma Regex <(?ms).*^\d\sDATE\s([^\r\n]*).*$>
renvoie "27 sept 1856" dans le premier "0 @XX@ INDI" puis "7 OCT 1956" dans le second "0 @XX@ INDI" et ainsi de suite suivant ma position INDI ... elle me convient donc parfaitement ...
Par contre j'ai un doute sur son orthographe car :
- dans <regex101.com> elle renvoie Full matche tout le fichier et le groupe "27 sept 1856" dans le premier cas puis "7 OCT 1956" dans le second cas.
- dans <NotePad+++> matches tout le fichier et sub-matches dans le premier cas le sub-matches "1/: 27 SEP 1856" dans le second cas "7 OCT 1956".
- dans <RegexTester> ne renvoie rien

Q1 - Pourquoi ces différences de renvoi entre par exemple entre <regex101.com> et <RegexTester> ?
Est elle mal écrite, Est il normal que le fichier entier apparaisse dans matche, .. Je ne comprends pas quoi ? ..

Après ta réponse nous parlerons de "Ville" et "Pays" si tu veux bien ...

Encore mille merci de ton aide ...

En échange de ton aide, je peux t'aider dans le domaine de l'énergie - énergie renouvelable - changement climatique, il me reste quelques connaissances.

Salutations
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Je ne peux pas te faire une réponse détaillée à cette heure, mais je peux répondre à ça
Q1 - Pourquoi ces différences de renvoi entre par exemple entre <regex101.com> et <RegexTester> ?
Est elle mal écrite, Est il normal que le fichier entier apparaisse dans matche, .. Je ne comprends pas quoi ? ..

Il y a pleins de moteurs de regex différents avec des subtilités de l’un à l’autre, par exemple pour certains moteurs les groupes peuvent avoir un nom pour les autres non.
D’où l’intérêt de faire des tests avec un outils qui utilise le même moteur que yed.
Je me sers principalement de regexstorm, car je code en C# et que ce site se sert du même moteur.
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Bonsoir,
Merci de ta réponse ..
Je note ta réponse , "la réponse des moteurs / testeur de Regex diffère" ..
Je vais donc d'abord tenter de déterminer le moteur qui correspond aux réponses acceptées par le logiciel Yed... pour affiner l'écriture du Regex puis je reviens vers toi..
Bonne soirée
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Pour la date
(?ms).*^\d\sDATE\s([^\r\n]*).*$
ce n'est pas bon car tu demandes que ça ailles jusqu'à la fin du texte avec $ mais que ça ne passe pas les sauts de lignes avec [^\r\n] c'est contradiction.

Ma regex
(?<=DATE\s)\d{1,2}\s[A-Z]{3}\s\d{4}
ne retournait pas 27 sept 1856 car dans un exemple précédent les mois étaient en majuscules et codés sur 3 lettres, "sept" c'est 4 minuscules
Ceci corrige cela (3 à 4 lettres)
(?<=DATE\s)\d{1,2}\s[A-Za-z]{3,4}\s\d{4}


Elle marche dans le module de recherche de NotePad++, sur RegexStorm.
Pour Regex101, sur la gauche, tu peux choisir le moteur.
Elle fonctionne avec les 3 premiers (PHP, JS et Python), mais pas avec Goland.


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Bonjour,

1/ Regex testeur
Suite a ta remarque mentionnant que les moteurs Regex testeur répondent différemment
J'ai donc testé <Notepad++>, <Regexstorm.net> et <Regex101.com>. Ce dernier <Regex101.com> me renvoide manière fiable des résultats correspondant à ma demande.. je m'en tiens donc à ce testeur.

2/ Des Regex
Mes chaines sont de la forme :
"
etc ...
0 @3I@ INDI
1 NAME Ren Mar Eugé/Mlé/
2 GIVN Ree Mare Eug
2 SURN Mué
1 SEX F
1 BIRT"0 @@
2 DATE 15 AUG 1884
1 PLAC Ville , Code Ville , Département , Région , Pays, SubdivisionTour
2 FOO Pli , Tour
.. etc"

Je sais extraire exclusivement (après bien des efforts !!)
<dans DATE> <15 AUG 1884> avec <(?ms).*^\d\sDATE\s([^\r\n]*).*$>
<dans PLAC Ville> <Ville> avec <(?ms).*^\d\sPLAC\s([^,]*),.*$>
<dans PLAC> <Code Ville> avec <(?ms).*^\d\sPLAC\s[^,]*,([^,]*),.*$>
<dans PLAC> <Pays> avec <(?ms).*^\d\sPLAC\s[^,]*,([^,]*),([^,]*),([^,]*),([^,]*),.*$>
or mieux avec
<(?ms).*^\d\sPLAC\s(?:[^\,]*\,){4}([^,]*).*$>

Q1 - Y a t'il dans ces Regex des fautes d'orthographe ?


Q2 - Comment s'écrit la RegEx Java pour extraire
<dans PLAC> ensemble "Ville Pays"" ou mieux "Ville - Pays" (avec un séparateur, par exemple "-" )

Merci a celui (ceux) qui m'aide(ent)
Salutations
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Je ne comprends décidément pas ce que tu veux.

Je t'ai dit que $ veut dire que aller jusqu'à la fin du texte, dans tes exemples les données à capturer ne sont jamais à la fin du texte.
Si je prend celle pour la date, avec ton dernier texte sur regex101
https://regex101.com/r/Seff2w/1
Elle ne capture pas la date, elle capture tout le texte et extrait la date dans un groupe.
J'ai commencé par te proposer des groupes et tu n'en voulais pas.
Si je reprends la regex de date que je t'ai proposé au message 12, sur regex101 avec ce même texte https://regex101.com/r/Seff2w/2
Elle ne capture bien uniquement que la date et tu as bien insisté sur le uniquement.
Donc sois je suis bête, soit tu ne sais pas ce que tu veux.

D'autre part, si pour x raison, dans ton fichier il y a DATE trucmuche, alors ta regex va récupérer "trucmuche" dans le groupe alors que la mienne non https://regex101.com/r/Seff2w/3
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Bonjour,
Merci de ta patience..

1/ RAPPEL - Mes chaines sont de la forme :
"
etc ...
0 @3I@ INDI
1 NAME Ren Mar Eugé/Mlé/
2 GIVN Ree Mare Eug
2 SURN Mué
1 SEX F
1 BIRT"0 @@
2 DATE 15 AUG 1884
1 PLAC Ville , Code Ville , Département , Région , Pays, SubdivisionTour
2 FOO Pli , Tour
.. etc"

2/ LA DEMARCHE
Effectivement dans la saisie de la Regex le logiciel que j'utilise (YED) :
a) - je saisie d'abord le groupe dans lequel je me place par exemple le groupe <NAME> ou <BIRT>
b) - dans ce groupe je cherche a saisir la <DATE> ou <PLAC> la <ville>, ou <PLAC> le <pays>..

3/ LES Regex
Je sais donc extraire (après bien des efforts !!)
<dans DATE> <15 AUG 1884> avec <(?ms).*^\d\sDATE\s(.*?)$.*>
<dans PLAC Ville> <Ville> avec <(?ms).*^\d\sPLAC\s([^,]*),.*$>
<dans PLAC> <Code Ville> avec <(?ms).*^\d\sPLAC\s[^,]*,([^,]*),.*$>
<dans PLAC> <Pays> avec <(?ms).*^\d\sPLAC\s[^,]*,([^,]*),([^,]*),([^,]*),([^,]*),.*$>
or mieux avec
<(?ms).*^\d\sPLAC\s(?:[^\,]*\,){4}([^,]*).*$>

Q1 - Y a t'il dans ces Regex des fautes d'orthographe ?

Q2 - Comment s'écrit la RegEx Java pour extraire
<dans PLAC> ensemble "Ville Pays"" ou mieux "Ville - Pays" (avec un séparateur, par exemple "-" )

Merci a celui (ceux) qui m'aide(ent)

Salutations
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Effectivement dans la saisie de la Regex le logiciel que j'utilise (YED) :
a) - je saisie d'abord le groupe dans lequel je me place par exemple le groupe <NAME> ou <BIRT>


Ha oui, ça change tout.....

Tu fais donc du ligne par ligne, est ce obligé par YED, ou c'est ton point de vue?
Parce que depuis le début, je m'efforce de trouver l'info adéquate (ou que je crois adéquate) dans le texte entier.

Sache que si ça n'est pas obligé, c'est une perte de temps.

Pour te répondre, je pars du principe que c'est obligé et je ne vais décrire que pour la date, car c'est pareil pour toutes les autres
(?ms).*^\d\sDATE\s(.*?)$.*

Au risque de me répéter
Elle ne capture pas la date, elle capture tout le texte et extrait la date dans un groupe.
...
J'ai commencé par te proposer des groupes et tu n'en voulais pas.



De plus, au risque de me répéter à nouveau.
Si pour x raison dans le fichier la ligne est
2 DATE trucmuche
ça capture trucmuche dans le groupe
https://regex101.com/r/Seff2w/5


Maintenant, j'ai nettement l'impression que tu ne tiens pas compte de mes réponses.
Donc, une fois pour toute, peux tu clairement répondre à ces trois questions
  • 1 ligne par ligne obligé ou capture sur tout le texte possible?
  • 2 utilisation des groupes ou pas?
  • 3 capture incohérente autorisée ou pas?


Si dans ton projet message, tu réponds à ces 3 questions, je continuerais à essayer de t'aider.
Par contre si comme tu le fais depuis le début, tu me balances
  • un nouveau texte d'exemple,
  • des regex qui ne prennent pas en compte mes remarques,
  • des explications obscures qui ne répondent pas à mes questions,

alors je passerai à autre chose.

PS arête de parler de Java puisque tu ne codes pas dans ce langage, les regex c'est un langage à part entière.
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Bonjour,
Je vais essayer de répondre à tes questions.
1- Comme dans ton exemple, dans <Regex101.com> et ta capture d'écran
J'extrait la date dans un groupe. Comme tu le vois, par exemple si dans le fichier la ligne est
2 DATE trucmuche
ça capture trucmuche dans le groupe
2- La réponse est ci-dessus
3-Je ne sais pas répondre
Comme tu l'écris, la Regex ne capture pas la date, Yed m'impose de capturer tout le texte et d'extraire la date dans un groupe.

En conclusion mes deux questions sont :
Q1 - Y a t'il dans mes Regex des fautes d'orthographe ?
Q2 - Comment s'écrit la RegEx Java pour extraire
<dans PLAC> ensemble "Ville Pays"" ou mieux "Ville - Pays" (avec un séparateur, par exemple "-" )

Merci de ta patience.
Salutations
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
Bonjour

OK,

cependant, ne pas savoir répondre à
3 capture incohérente autorisée ou pas?
est problématique, pour la date, si par la suite, YED essaye de transformer "trucmuche" en date ça va planter.

Je m'explique 15 AUG 1884 c'est du texte, pas une date.
Dans la vraie vie, écrire 15 AUG 1884 en haut d'une lettre, signifie que l'on écrit cette lettre ce jour là, ça matérialise la date, mais ça n'est pas la date. La date c'est un décompte de jours, selon un cycle annuel depuis une référence, donc quelque part c'est un nombre. En informatique c'est un nombre (pour beaucoup de logiciels/systèmes, c'est le nombre de seconde depuis le 1/1/1970 à 00:00:00).
Donc ce texte 15 AUG 1884, l'informatique sait le convertir en Date, alors que trucmuche non.

Donc je vais continuer à penser (et appliquer) que la capture doit être cohérente.
De plus si tu peux gagner l'étape de la sélection ligne par ligne mes regex fonctionnent aussi bien sur le texte entier que sur une seule ligne (je ne le montre que pour la date, mais en supprimant tout ou partie du texte dans regex101 tu pourras le vérifier pour les autres)

Pour la Date:
Cette regex
DATE\s(\d{1,2}\s[A-Za-z]{3,4}\s\d{4})
capture dans un groupe (sans nom) un texte qui est cohérent avec une date:


Pour la Ville:
Je considère que le nom doit contenir des lettres uniquement, ce qui donne
PLAC\s([A-Za-z]+)
https://regex101.com/r/L6eRJ9/3
avec ta regex @2# serait considéré comme une ville.
On peut accepter des nombres éventuellement, il suffit de remplacer
[A-Za-z]
par
\w
, ce qui donne
PLAC\s(\w+)
https://regex101.com/r/L6eRJ9/4


Pour le Pays:
Idem que des lettres
PLAC\s(?:.+?,){4}\s?([A-Za-z]+)(?=\s?,)
https://regex101.com/r/L6eRJ9/5
ou des lettres et des chiffres
PLAC\s(?:.+?,){4}\s?(\w+)(?=\s?,)
https://regex101.com/r/L6eRJ9/6


Enfin Ville - Pays.
C'est un peu plus compliqué.
Cette regex
\d PLAC\s?([A-Za-z]+)\s?,(?:.+?,){3}\s?([A-Za-z]+).+
capture ville et pays (en lettres uniquement) dans 2 groupes séparés.
https://regex101.com/r/L6eRJ9/9

La suite dépend de YED,
  • si tu peux récupérer séparément le contenu des groupes 1 et 2 pour les concaténer alors c'est une très bonne option, car tu en fais ce que tu veux et tu peux travailler sur le texte entier (au passage, c'est ce que je t'ai proposé dés le début (23 mars), donc si on en revient là on a perdu 10 jours....)
  • si YED permet de faire des remplacementS par regex, là il faut travailler en ligne par ligne et mettre
    $1 - $2
    comme syntaxe de substitution, dans l'exemple je n'ai laissé que les lignes concernées le résultat est le cumul de toutes les substitutions (ça je te l'ai dit le 25 mars)

https://regex101.com/r/L6eRJ9/8
  • Si YED ne permet ni de travailler avec plusieurs groupes ni les remplacements, alors je ne voie pas de solution


Note que si YED sait travailler avec plusieurs groupes alors cette regex
DATE\s(\d{1,2}\s[A-Za-z]{3,4}\s\d{4}).*?\d PLAC\s?([A-Za-z]+)\s?,(?:.+?,){3}\s?([A-Za-z]+)
avec l'option SingleLine
capture la date, la ville et le pays dans 3 groupes
https://regex101.com/r/L6eRJ9/10
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Bonjour,
Merci de ton aide et surtout de tes conseils.
En définitive :
Tes Regex font deux choses d'une part elles capturent un groupe (par exemple la date) d'autre part elles en vérifient une forme de cohérence de l'écriture.

Mes Regex, moins performantes, capturent par exemple le groupe date mais n'en vérifient pas la cohérence et considèrent que le contenu est une date quel que soit le contenu (même s'il est absurde).

D'accord avec mon énoncé ?

Par contre ton idée de concaténer Ville et pays via $1-$2 est intéressante, je vais la tester en suivant..
Salutations
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
D’accord avec ton énoncé.
Messages postés
11
Date d'inscription
dimanche 22 mars 2020
Statut
Membre
Dernière intervention
9 avril 2020

Bonjour,
Merci beaucoup de ton aide..
Si je peux t'aider.
Salutations
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
420
De rien.

As tu pu faire un Replace avec $1 - $2?
Si oui, et si ton problème est résolu, pense à marquer le sujet comme tel avec le bouton tout en haut du fil