2008-11-09 11 views
4
var pattern = /^0+$/; 

Je pense ceci:Comment lisez-vous cette expression régulière JavaScript?

« Jetez un oeil à la fois le début et la fin de la chaîne, et s'il y a un modèle d'un ou plusieurs zéros au début et à la fin, puis revenir ce modèle "

Je suis sûr que ce mal, cependant, parce que quand je lance l'expression avec cette chaîne:

var string = "0000009000000"; 

Il arrive null.

Alors qu'est-ce que ça veut vraiment dire? Et pendant que je demande, quoi/comment JavaScript considère-t-il le début, le milieu et la fin d'une chaîne?

MISE À JOUR # 1: Merci pour les réponses! Je pense que je comprends cela maintenant. Ma confusion provenait du fait que je visualisais la chaîne comme ayant un début, un milieu et une fin. Comme ceci:

[à partir] [milieu] [fin]

En d'autres termes, pour la chaîne donnée ci-dessus, les expressions suivantes fonctionnent comme je les attends à:

/^0+/; retours "000000" (un motif d'un ou plusieurs zéros au début de la chaîne)

et

/0+$/; retours « 000000 » (un modèle d'un ou plusieurs zéros à la fin de la chaîne)

MISE À JOUR # 2: Je mis voté toutes les réponses à ce point, parce qu'ils sont tous utiles, et je compilé les réponses dans un grand grand:

Vu le code JavaScript suivant:

var string = "0000009000000"; 
var regExp = /^0+$/; 
alert(regExp.exec(string)); 

Il se lit, en partie, comme ceci:

« Si le caractère exact (s) suivi du^modificateur et précédé du modificateur $ dans l'expression régulière ne sont pas placés SIMULTANÉMENT dans la ou les première (s) position (s) de la chaîne ET la (les) dernière (s) position (s) de la chaîne (c.-à-d. Sinon, renvoyez le (s) caractère (s). "

En d'autres termes, supposons que la chaîne donnée soit six zéros" 000000 ", ce qui entraîne une correspondance car le même groupe de caractères" 0 "est placé dans les deux. premières positions (1er 2e 3e 4e 5e 6e) et les dernières positions (1er 2e 3e 4e 5e 6e) de la chaîne.

Cependant, dans la chaîne donnée d'origine, il y a six zéros, suivi d'un neuf, suivi de six zéros ("0000009000000") Maintenant, les six zéros dans les premières positions de la chaîne (1er, 2ème, 3ème, 4ème, 5ème, 6ème) ne sont pas exactement les mêmes six zéros assis dans les dernières positions de la chaîne (8ème, 9ème, 10ème, 11ème, 12ème, 13ème).est renvoyé.

+1

Re: mise à jour 2. Manière de trop réfléchir. L'expression dit simplement "correspondre au début de la chaîne, suivi de 1 ou plusieurs 0, suivi de la fin de la chaîne". Ne pensez pas à^et $ en tant qu'emplacements, mais en tant qu'appariants pour le caractère de début (inexistant) et le terminateur. – billjamesdev

+0

Peut-être que ... mais en posant cette question, je me suis rendu compte qu'il ne suffisait pas de connaître la définition - j'ai besoin de «passer sous le capot» et d'apprendre la RAISON pour la définition - c'est l'algorithme que je cherche! :) –

Répondre

10

Il est dit que votre chaîne contient seulement 0 ...il doit commencer, puis avoir 1 ou plusieurs 0, puis se terminer.

7

^0 +

$
  • position Assertion au début de la chaîne «^»
  • match le caractère « 0 » littéralement «0+»
    • Entre un et nombre illimité de fois, autant de fois que possible, redonner selon les besoins (avide) «+»
  • Position d'assertion à la fin de la chaîne (ou avant le saut de ligne à la fin de la s Tring, le cas échéant) «$»
2

Si vous voulez qu'il corresponde à votre chaîne, vous voulez que votre regexp être quelque chose comme:

var pattern = /^0+.*0+$/ 

Cela correspondra 1 ou plus « 0 'de début , 1 ou plus de 0 à la fin, et 0 ou plus de n'importe quoi dans le milieu.

+0

Pensez qu'il voulait "commence par 0s OU se termine par 0s" ... le vôtre nécessite un 0 au début et à la fin. – billjamesdev

+0

Non, il voulait "un ou plusieurs zéros au début et à la fin" –

2

Un motif d'au moins une , ancrée à la fois le début (^) et l'extrémité ( $) d'une ligne; en d'autres termes, la chaîne se compose d'un ou de plusieurs zéros.

pour correspondre à une chaîne composée de chiffres de 0 à 9, et en commençant et se terminant par au moins un zéro, le motif

/^0+[0-9]+0$/ 

pourrait fonctionner, soit en jeu un ou plusieurs zéros, puis un ou plusieurs chiffres 0 -9, se terminant par un zéro.

Sauf instruction contraire, JavaScript traitera la chaîne entière comme une seule ligne, en ignorant les caractères de retour à la ligne; pour le forcer à considérer plusieurs lignes séparées, utilisez le modificateur m, par ex.

/regex/m 

Voir aussi:JavaScript regular expression overview on Mozilla Developer Center

1

En réponse à votre mise à jour - vous êtes un peu à droite. La chaîne que l'expression rationnelle essayera d'apparier a un début, un milieu et une fin.

Mais vous savez quoi? Toutes les chaînes ont un début et une fin.

dit Votre regex, la chaîne doit avoir un début, une fin et entre les deux, ne une chaîne de zéros.

Ne considérez pas votre 000000 comme étant au début, ou votre 900000 comme étant à la fin. En fait, ignorez l'idée de commencer et de terminer pour un moment.

  • Cette expression régulière « doit avoir des zéros dans quelque part »: /0+/
  • Cette expression régulière « doit avoir des zéros dans ce et rien d'autre: /^0+$/

pourquoi nous ajoutons Parce qu'il n'y a pas de notation regex pour "et rien d'autre", nous devons donc spécifier "début de chaîne, quelques zéros, fin de chaîne", ce qui revient à la même chose

Par ailleurs, vous avez obtenu ce tort aussi:

s'il y a un motif d'un ou plusieurs zéros au début et à la fin, puis revenir ce modèle

votre regex a gagné » t retourner "ce motif", il ne retournera que true. Vous avez besoin de parenthèses pour obtenir le modèle: /^(0+)$/

0

J'ai toujours mis mes expressions rationnelles dans des mots humains pour m'assurer que c'est ce que je voulais dire.

This:^0 + $

se lirait comme suit: « Si dès le début (^) de ma chaîne, vous trouverez au moins un (+) zéro (0), et rien d'autre jusqu'à la fin ($) de la chaîne. " Rappelez-vous, une regex est fondamentalement un groupe d'instructions "If". Donc d'abord, il doit être "vrai", et ensuite il va retourner le meilleur résultat possible. Un Regex ne retournera jamais un résultat "un peu vrai", ou un résultat "plutôt vrai".

1

@CodeCurious, vous êtes toujours en train de le rendre plus compliqué qu'il ne devrait l'être. La regex /^0+$/ signifie simplement que la chaîne entière est constituée d'un ou de plusieurs zéros. Les expressions régulières offrent beaucoup de possibilités de confusion, alors acceptez la simplicité partout où vous pouvez la trouver.

+0

Croyez-moi, ce n'est pas la première fois qu'on me dit que je rends les choses plus compliquées que nécessaire! :) Mais, sérieusement, je réalise à première vue, cette regex est assez simple. Mais mon cerveau a besoin de le voir d'un niveau plus profond afin de vraiment le comprendre. –

Questions connexes