Voici une expression régulière que j'ai créée pour l'utiliser en JavaScript:
var reg_num = /^(7|8|9)\d{9}$/
En voici une autre suggérée par le membre de mon équipe.
var reg_num = /^[7|8|9][\d]{9}$/
La règle est de valider un numéro de téléphone:
- Il ne devrait y avoir que dix nombres.
- Le premier nombre est censé être l'un des 7, 8 ou 9.
(7|8|9)
et[789]
ne sont pas équivalents, car le premier est la capture, le second non.(?:7|8|9)
serait équivalent par contre (je suppose que vous le savez bien sur ...).[<<|>>|\]\]|\[\[]
. En raison du contexte, je sais que regex essaie de faire correspondre<<
ou>>
ou[[
ou]]
. Mais d'après ce que vous avez dit, cela devrait correspondre à<
ou>
ou[
ou]
. Si vous utilisez|
entre[]
, les parenthèses se comportent-elles différemment?|
dans une classe de caractères[...]
, à moins que vous ne vouliez faire correspondre le caractère pipe lui-même. De plus, la duplication de caractères dans une classe de caractères n'a aucun effet - une classe de caractères est une liste de caractères et correspondra exactement à l'un d'entre eux. Je suppose que vous voulez un groupe , qui utilise des parenthèses rondes normales:(<<|>>|\]\]|\[\[)
Les conseils de votre équipe sont presque corrects, sauf pour l'erreur qui a été commise. Une fois que vous aurez découvert pourquoi, vous ne l'oublierez jamais. Jetez un œil à cette erreur.
Ce que cela fait:
^
et$
désigne des correspondances ancrées, ce qui affirme que le sous-modèle entre ces ancres est la correspondance entière. La chaîne ne correspondra que si le sous-modèle correspond à l'intégralité de celui-ci, pas seulement à une section.()
désigne un groupe de capture .7|8|9
désigne correspondant à l' une des7
,8
ou9
. Il le fait avec des alternances , ce que fait l'opérateur de tuyauterie|
- en alternant entre les alternances. Ce retour en arrière entre les alternances: si la première alternance n'est pas appariée, le moteur doit revenir avant l'emplacement du pointeur déplacé pendant le match de l'alternance, pour continuer à faire correspondre l'alternance suivante; Alors que la classe de caractères peut avancer séquentiellement. Voir cette correspondance sur un moteur regex avec les optimisations désactivées:\d{9}
correspond à neuf chiffres.\d
est un métacaractère abrégé, qui correspond à tous les chiffres.Regardez ce qu'il fait:
^
et$
désigne également les correspondances ancrées.[7|8|9]
est une classe de caractères . Tous les caractères de la liste7
,|
,8
,|
ou9
peuvent être adaptés, ainsi l'|
a été ajouté à tort. Cela correspond sans retour en arrière.[\d]
est une classe de caractères qui habite le métacaractère\d
. La combinaison de l'utilisation d'une classe de caractères et d'un seul métacaractère est une mauvaise idée, d'ailleurs, car la couche d'abstraction peut ralentir la correspondance, mais ce n'est qu'un détail d'implémentation et ne s'applique qu'à quelques implémentations de regex. JavaScript n'en est pas un, mais il allonge légèrement le sous-modèle.{9}
indique que la construction unique précédente est répétée neuf fois au total.La regex optimale est
/^[789]\d{9}$/
, parce que/^(7|8|9)\d{9}$/
captures inutilement ce qui impose une diminution des performances sur la plupart des implémentations de regex (javascriptse trouve en être un, étant donné que la question utilise un mot-clévar
dans le code, il s'agit probablement de JavaScript). L'utilisation dephpqui fonctionne sur PCRE pour la correspondance preg optimisera le manque de retour en arrière, mais nous ne sommes pas non plus en PHP, donc utiliser des classes[]
au lieu d'alternations|
donne un bonus de performance car le match ne revient pas en arrière, et donc à la fois correspond et échoue plus rapidement que d'utiliser votre expression régulière précédente.la source
Les 2 premiers exemples agissent très différemment si vous les REMPLACEZ par quelque chose. Si vous correspondez à ceci:
vous remplaceriez 7 ou 8 ou 9 par la chaîne vide.
Si vous correspondez à cela
vous allez remplacer
7
ou8
ou9
OU LA BARRE VERTICALE !!!! par la chaîne vide.Je viens de découvrir cela à la dure.
la source
|
).