121 votes

Expression rationnelle pour trouver un chiffre deux ou quatre fois

C'est une question simple sur les expressions régulières, mais je ne trouve pas la réponse.

Je veux déterminer si un nombre apparaît en séquence exactement deux ou quatre fois. Quelle syntaxe puis-je utiliser?

\d{quoi mettre ici?}

J'ai essayé \d{2,4}, mais cette expression accepte également trois chiffres.

1 votes

Par exemple, pour correspondre à une année de deux ou quatre chiffres.

0 votes

Que voulez-vous qu'il se passe si la chaîne est abc 123 xyz? Doit-elle correspondre à 12 car il s'agit exactement de deux chiffres en séquence? Ou ne devrait-elle pas correspondre, car 12 fait partie d'une séquence de chiffres plus grande 123 qui elle-même n'est ni de longueur 2 ni de longueur 4? Si je devais deviner, je pense que vous voulez le dernier comportement, mais ce n'est pas clair dans votre question. Des exemples et/ou une spécification plus claire seraient utiles. Même question pour abc 12345 def... qu'est-ce qu'il devrait se passer là?

186voto

ruakh Points 68789

Il n'y a pas de syntaxe spécifique pour cela, mais il y a beaucoup de façons de le faire :

(?:\d{4}|\d{2})    <-- alternance : quatre chiffres si possible, sinon juste deux
\d{2}(?:\d{2})?    <-- deux chiffres, plus deux de plus si possible
(?:\d{2}){1,2}     <-- deux chiffres, une ou deux fois

Donc, par exemple, pour faire correspondre des chaînes composées d'une ou plusieurs lettres A–Z suivies de deux ou quatre chiffres, vous pourriez écrire ^[A-Z]+(?:\d{4}|\d{2})$ ; et pour faire correspondre une liste de nombres de deux ou quatre chiffres séparés par des virgules, vous pourriez écrire ^((?:\d{4},|\d{2},)*(?:\d{4}|\d{2})$ ou ^(?:\d{2}(?:\d{2})?,)*\d{2}(?:\d{2})$.

2 votes

Personnellement, seulement pensé à la solution \d{2}(?:\d{2})? immédiatement - belle variété de celles-ci - la dernière, en particulier, semblant très agréable et évolutive.

3 votes

+1 pour avoir été attentif à l'ordre nécessaire lors de l'utilisation de l'alternance pour correspondre d'abord à 4 chiffres, puis à 2 chiffres. Bon travail également en fournissant les autres variations.

10 votes

Pour quiconque, comme moi, n'a pas compris l'utilisation de (?:, cela commence un "groupe de non-capture" (un groupe qui n'est pas censé être référencé dans une déclaration de remplacement). Vous pouvez également simplement utiliser des parenthèses mais elles créeront un groupe de capture. Plus de détails ici : stackoverflow.com/questions/3512471/non-capturing-group

17voto

JGFMK Points 405
(?


Cela correspondrait à 3 chiffres (ou 5). [Donc, à mes yeux, c'est incorrect](https://regex101.com/r/GxN7wm/1).

1.  Vérifiez qu'il n'y a pas de chiffre avant une séquence de 2 ou 4 chiffres, ou après une séquence de deux ou quatre chiffres.

*   La syntaxe `(? est un lookbehind négatif`

``*   La syntaxe `(?!)` est un lookahead négatif.
    ``

``La méthode ci-dessus fonctionnerait pour le milieu de la chaîne :

Si votre chaîne de recherche n'a pas de contenu autour, vous pouvez utiliser les ancres `^` et `$` de début et de fin de chaîne :

    ^\d{4}$|^\d{2}$`` ```

4 votes

Je ne dirais pas que la réponse acceptée est fausse. Je dirais que la question est peu claire, et que cette réponse aborde une interprétation valide de celle-ci. Votre réponse aborde une autre interprétation valide (que je trouve être plus probable - mais apparemment l'auteur de la question ne l'a pas pensé...).

7 votes

"Ce serait correspondre à 3 chiffres" n'est pas tout à fait précis. Je pense que vous voulez dire "Ce serait correspondre à une sous-séquence de 2 chiffres d'une séquence de 3 chiffres".

2 votes

Aussi, votre réponse ne fonctionne pas tout à fait comme prévu sur des séquences de 5 chiffres ou plus. Je ne suis pas un expert en regex, mais je suppose qu'une façon de le réparer est de faire en sorte que le lookaround négatif s'applique aux deux cas (séquences de 2 et 4 chiffres) : (?

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