Extraction optionnelle partielle de chaine avec regex

Résolu
Aksl - 15 juin 2022 à 18:03
Whismeril Messages postés 18399 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 mai 2023 - 20 juin 2022 à 14:47
Bonjour à tous,
J'utilise regex pour extrait des informations dans un nom de fichier.

Par exemple j'extrait MIDI, PLA, GEN, 067 et le numéro de révision E dans "MIDI-PLA-GEN-067-2022V2_Screenshots_E"

Mais il arrive fréquement que les utilisateurs oublient de mettre la révision "MIDI-PLA-GEN-067-2022V2_Screenshots".

Je cherche une regex qui me permet d'extrait le numéro de révision si il est présent, but sans erronément prendre d'autres caractères.

Avec la regex MIDI-(?<std_building_type>[a-zA-Z]{1,4})-(?<std_building_activity>\w{1,3})-(?<std_building_no_fiche>\d{1,3})-(?<title>.*)(_(?<std_building_ind>[a-zA-Z])), il me détecte S comme numéro de révision si je n'en indique pas un.

L'exemple est disponible ici : https://regex101.com/r/HoAnAN/1

Merci pour votre aide.

5 réponses

Whismeril Messages postés 18399 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 mai 2023 623
Modifié le 15 juin 2022 à 19:26
Bonjour

oui, la capture s'arrête là 2022V2_S donc avec S, parce que tu lui a dit que "le point de repère" est un _, or sans numéro de révision le dernier _ est là.

Je vois 2 options, mais elle dépendent d'informations que tu n'as pas données.
  • Pour la première façon de faire
    • Est ce que ces datas sont au milieu de tout un tas d'autres dans un grand texte (dans ce cas poste un exemple représentatif de ce qu'il y a avant et après)?
    • Est que ces datas constituent systématiquement une ligne dans un grand texte?
    • Ou est ce que ces datas constituent la totalité du texte que tu traites?
  • Pour la seconde façon de faire, est-ce que cette partie "2022V2" est toujours de ce type, à savoir une année, le V est un numéro constitué d'un ou plusieurs chiffres (lettres? ) ?




Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Merci pour ta réponse.

Le fichier est constitué de 3 parties : (code)-(texte libre)_(revision)
S'agissant du nom de fichier, il n'y a ni caractères avant, ni après. L'exemple donné est la chaîne de caractère.

La partie "2022V2_Screenshots" correspond au texte libre du nom de fichier. Je n'ai pas de maîtrise sur l'utilisateur. Il insère lui même des underscore sans que je puisse le lui interdire.

Dit en langage naturel, voici ce que je souhaitais que la regex fasse (séquentiellement) :
  • Elle doit commencer par MIDI-
  • Extraire les caractères alphanumériques jusqu'au prochain tiret (= type)
  • Extraire les caractères alphanumériques jusqu'au prochain tiret (= activity)
  • Extraire les chiffres jusqu'au prochain tiret (no_fiche)
  • Extraire le dernier caractère alphanumérique de la chaine si précédé d'un underscore (= revision)
0
Whismeril Messages postés 18399 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 mai 2023 623
Modifié le 20 juin 2022 à 14:46
Bonsoir

OK, alors il faut indiquer que la capture va jusqu'à la fin du texte (avec $) et que le _ et la lettre sont facultatifs
MIDI-(?<std_building_type>[a-zA-Z]{1,4})-(?<std_building_activity>\w{1,3})-(?<std_building_no_fiche>\d{1,3})-(?<title>.*?)(?:_(?<std_building_ind>[a-zA-Z]))?$


Exemple ici https://regex101.com/r/4RnsHf/1

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Un tout grand Merci Whismeril! Vous m'avez débloqué ! C'est précieux.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 18399 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 mai 2023 623
20 juin 2022 à 14:47
De rien, je me suis aperçu que je n'avais pas bien copié collé la regex dans la discussion.
C'est corrigé.

Pense à marquer le sujet résolu

0