web-dev-qa-db-fra.com

Regex comment faire correspondre un caractère optionnel

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

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?

168
Tim Pietzcker

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.

15
codaddict

Vous devez également marquer la lettre comme optionnelle:

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

ou rendre la partie entière optionnelle

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

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.

0
robinvrd