J'ai un regex que je pensais que fonctionnait correctement jusqu'à maintenant. Je dois faire correspondre un caractère facultatif. Il peut être là ou pas.
Voici deux chaînes. La chaîne supérieure est appariée alors que la chaîne inférieure ne l'est pas. L'absence d'une seule lettre dans la chaîne inférieure est ce qui la fait échouer.
Je voudrais obtenir la lettre simple après les 5 premiers chiffres si elle est là et sinon, continuez à obtenir le reste de la chaîne. Cette lettre peut être A-Z
.
Si je supprime ([A-Z]{1}) +.*? +
de la regex, il correspondra à tout ce dont j'ai besoin à l'exception de la lettre, mais c'est un peu important.
20000 K Q511195DREWBT E00078748521
30000 K601220PLOPOH Z00054878524
Voici la regex que j'utilise.
/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/
Utilisation
[A-Z]?
rendre la lettre facultative. {1}
est redondant. (Bien sûr, vous pouvez aussi écrire [A-Z]{0,1}
, ce qui voudrait dire la même chose, mais c'est pour cela que ?
est là.)
Vous pourriez améliorer votre regex pour
^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})
Et, comme dans la plupart des dialectes regex, \d
est identique à [0-9]
:
^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})
Mais avez-vous vraiment besoin de 11 groupes de capture distincts? Et si oui, pourquoi ne capturez-vous pas le dernier groupe de chiffres?
Vous pouvez rendre la lettre unique facultative en ajoutant un ?
après comme:
([A-Z]{1}?)
Le quantificateur {1}
est redondant afin que vous puissiez le laisser tomber.
Vous devez également marquer la lettre comme optionnelle:
([A-Z]{1})? +.*? +
ou rendre la partie entière optionnelle
(([A-Z]{1}) +.*? +)?
Vous pouvez également utiliser des expressions rationnelles plus simples conçues pour votre cas, telles que (.*)\/(([^\?\n\r])*)
, où $2
correspond à ce que vous souhaitez.