2013-08-10 4 views
0

Le regex est:Que fait cette regex spécifique?

/^\/node?(?:\/(\d+)(?:\.\.(\d+))?)?/ 

Je peux comprendre que / au début et la fin sont délimiteurs regex, également ^\/node est une chaîne commençant par /node Qu'est-ce qui se passe après ça me bat!

+0

Je recommande de suivre un tutoriel regex: http://www.regular-expressions.info/tutorial.html. Tout est expliqué ici. –

+0

Littéralement, tout article, tutoriel ou aide-mémoire sur les expressions régulières indique ce que signifient ces symboles. Quelle partie n'est pas claire? – JJJ

Répondre

5

Vous devriez chercher à obtenir un outil comme RegexBuddy. Il expliquera tout dans une regex donnée, ainsi que comment il compile et comment il se branche.

PCRE ou similaires En supposant:

/     //begin 
     ^    //start of string 
     \/    //literal/
     node?   //I assume node is optional, normally it'd be (node)? 
         //? makes the previous expression optional 
     (
      ?:   //non-capturing group (think of it like dont capture <this>) 
      \/   //literal/
      (\d+)  // one or more digits, 0-9 
      (
        ?: // another non-capturing group 
        \.\. // literal .. 
        (\d+) // one or more digits 0-9 
      ) 
      ?   // optional once more 
     ) 
     ?    // make the previous group optional 
    /    // end 
+3

'?:' n'est pas un lookahead négatif. C'est un groupe qui ne capture pas. Je ne connais pas de moteur/env regex. en utilisant '?:' comme lookahead négatif ... – Jerry

+1

@Jerry whoops, c'est '?!'. ma faute. – Amelia

+0

Yup! C'est mieux! – Jerry

3

? quoi que ce soit qui suit ceci est "facultatif"

(?: groupe non-capture

\/ échappé/

(\d+) -Plus que 1 chiffre - également dans un groupe de capture "()"

(?: nouveau

\. - s'est échappé.

\. - encore une fois

(\d+) - comme avant

)?)? - pas sûr - ce que la saveur de regex est-ce?

+0

hmm, apparemment, nous travaillons à partir de différentes saveurs de regex. – Amelia

+0

@Hiroto oui pour moi ?? est "previous is optionnel" ... OP n'a pas spécifié –

3

Vous avez raison, le / au début sont délimiteurs motif. Permet de supprimer ceux pour la simplicité

^\/node?(?:\/(\d+)(?:\.\.(\d+))?)? 

Le (?:...) est un groupe non-capture. C'est un groupe qui n'est pas attrapé dans un groupe de correspondance. Ceci est une optimisation, supprimons le ?: pour rendre le motif plus clair.

^\/node?(\/(\d+)(\.\.(\d+))?)? 

Le \ est un caractère d'échappement, donc \/ est en fait juste un / mais comme ceux-ci indiquent le début et la fin du modèle doit alors être échappé. Le . correspond (presque) à n'importe quel caractère, il doit donc être échappé aussi.

Le ? rend le motif de retrait facultatif, donc ()? signifie que tout ce qui figure entre parenthèses apparaît zéro ou une fois.

  • ^ indique le début de la chaîne
  • \/node? correspond /node ou /nod
  • \/(\d+) matchs / suivi d'un ou plusieurs chiffres (le \d+).Les chiffres sont capturés dans le premier groupe de correspondance
  • (\.\.(\d+))? correspond à .. suivi d'un ou plusieurs chiffres (\d+). Les chiffres sont capturés dans le deuxième groupe de correspondance
+0

Excellente réponse, j'aime comment vous avez supprimé les trucs qui ne s'appliquaient pas à la façon dont le motif correspond. –