272 votes

Regex : comment faire correspondre un caractère optionnel

J'ai une regex dont je pensais qu'elle fonctionnait correctement jusqu'à présent. J'ai besoin d'une correspondance sur un caractère optionnel. Il peut être présent ou non.

Voici deux chaînes. La corde supérieure est appariée alors que la corde inférieure ne l'est pas. L'absence d'une seule lettre dans la chaîne inférieure est à l'origine de l'échec.

J'aimerais obtenir la lettre qui suit les 5 premiers chiffres, si elle est présente, et sinon, continuer à obtenir le reste de la chaîne. Cette lettre peut être A-Z .

Si je supprime ([A-Z]{1}) +.*? + de la regex, elle correspondra à tout ce dont j'ai besoin sauf à la lettre, mais elle est assez importante.

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})/

420voto

Tim Pietzcker Points 146308

Utilisation

[A-Z]?

pour rendre la lettre facultative. {1} est redondant. (Bien entendu, vous pouvez également écrire [A-Z]{0,1} ce qui reviendrait au même, mais c'est ce que la ? est là pour ça).

Vous pourriez améliorer votre expression rationnelle de la manière suivante

^([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, puisque dans la plupart des dialectes de 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 pas capturer l'avant-dernier groupe de chiffres ?

60voto

codaddict Points 154968

Vous pouvez rendre la lettre unique facultative en ajoutant un ? après lui comme :

([A-Z]{1}?)

Le quantificateur {1} est redondant, vous pouvez donc l'abandonner.

16voto

Stefan Points 29091

Vous devez également indiquer que la lettre unique est facultative :

([A-Z]{1})? +.*? +

ou rendre toute la partie facultative

(([A-Z]{1}) +.*? +)?

1voto

robinvrd Points 979

Vous pouvez également utiliser des expressions rationnelles plus simples conçues pour votre cas, telles que (.*)\/(([^\?\n\r])*)$2 correspond à ce que vous voulez.

0voto

Bilal Khursheed Points 351

Voici l'expression rationnelle pour le mot de passe qui requiert un minimum de 8 caractères comprenant un chiffre, une lettre minuscule et une lettre majuscule, ainsi qu'un caractère spécial facultatif.

/((?=. \d )(?=. [a-z])(?=.*[A-Z])(?![~@#$%^&*_-+=`|{}:;!.?"()[]]).{8,25})/

/((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?![~@#\$%\^&\*_\-\+=`|{}:;!\.\?\"()\[\]]).{8,25})/

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