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 dans l'ordre exactement deux ou quatre fois. Quelle syntaxe puis-je utiliser?
\d{what goes here?}
J'ai essayé \d{2,4}
, mais cette expression accepte également trois chiffres.
abc 123 xyz
? Doit-il correspondre12
parce que c'est exactement deux chiffres dans l'ordre? Ou ne devrait-il pas, car12
fait partie d'une séquence de chiffres plus grande123
qui elle-même n'est ni 2 ni 4? Si je devais deviner, je pense que vous voulez ce 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 pourabc 12345 def
... que doit-il se passer là-bas?Réponses:
Il n'y a pas de syntaxe spécifique pour cela, mais il existe de nombreuses façons de le faire:
la source
\d{2}(?:\d{2})?
solution dès le départ - belle variété de ceux-ci - la dernière, en particulier, semble très agréable et évolutive.(?:
ceci, lance un "groupe non capturant" (un groupe qui n'est pas destiné à être référencé dans une instruction replace). Vous pouvez également simplement utiliser des parenthèses, mais celles-ci créeront un groupe de capture. Plus de détails ici: stackoverflow.com/questions/3512471/non-capturing-group"333"
. Vous utilisez peut-être par erreur la fonctionnalité "trouver la sous-chaîne correspondante" de votre bibliothèque de regex, plutôt que sa fonctionnalité "vérifier si la chaîne complète correspond". Vous devriez consulter sa documentation.C'est la bonne façon de procéder. La réponse acceptée est fausse.
Il correspondrait à 3 chiffres (ou 5). C'est donc faux à mes yeux .
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 négative.(?!)
la syntaxe est une anticipation négative.Ce qui précède fonctionnerait pour la corde médiane:
Si votre chaîne de recherche n'a pas de contenu autour d'elle, vous pouvez utiliser les ancres de chaîne
^
et de$
début et de fin:la source
(?<!\d)(\d{2}|\d{4})(?!\d)
^\d{4}$|^\d{2}$
serait un moyen potentiel de résoudre ce problème. Comme le ferait^\d{2}(?!\d)|^\d{4}(?!\d)