3 votes

Comment construire une regex pour ne pas renvoyer une chaîne vide si aucun des groupes ne renvoie de résultat ?

J'essaie de construire une regex pour faire correspondre l'entrée des heures de la feuille de temps où l'utilisateur entre ses heures dans le format suivant 20h 50m .

Dans ce format, l'utilisateur peut soit saisir uniquement les heures 20h ou minutes seulement 50m ou à la fois les heures et les minutes 20h 50m .

Exemples de correspondances

45m
1h
2h 45m

Les chiffres peuvent être n'importe quoi d'autre que 20 o 50 .

J'ai trouvé cette expression ((([0-9]+h)\s([0-9]+m))|([0-9]+h)|([0-9]+m)){1} qui est longue et que j'essaie de réduire.

J'ai donc essayé une autre solution : ((\d+h)?([\s]*(\d+m))?) https://regex101.com/r/ZEBsle/1/ Mais le problème avec cette solution est qu'elle correspond à des chaînes vides et ne correspond pas à des motifs tels que 2h 45m .

Comment puis-je modifier la dernière expression rationnelle pour qu'elle puisse correspondre aux formats suivants ?

45m
1h
2h 45m

1voto

Roko C. Buljan Points 46488

Voici mon point de vue :

/(?<=\b)\d+h \d+m|\d+[hm](?=\b)/g

Exemple sur Regex101

const str = `45m
1h
4h 35m
some text before 2h 45m and after
travelled 66miles
2m 45h this one are inversed, so treat them separately
245m`;

const times = str.match(/(?<=\b)\d+h \d+m|\d+[hm](?=\b)/g);
console.log(times);

0voto

ZaO Lover Points 449
\d+h\s\d+m|\d+h|\d+m

Je pense que ça va marcher.

0voto

The fourth bird Points 40138

Pour faire correspondre toutes les variantes, vous pouvez utiliser

\b(?:\d+h(?: \d+m)?|\d+m)\b

Explication

  • \b Une frontière de mots
  • (?: Groupe de non capture
    • \d+h Faites correspondre 1+ chiffres et h
    • (?: \d+m)? Possibilité de faire correspondre une partie minuscule
    • | Ou
    • \d+m Faites correspondre 1+ chiffres et m
  • ) Groupe fermé
  • \b Une frontière de mots

Démonstration de Regex

Si vous souhaitez faire correspondre les heures et les minutes dans cet ordre, vous pouvez utiliser des ancres ^ y $

^(?:\d+h(?: \d+m)?|\d+m)$

Démonstration de Regex

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X