Ruby 1.8.7. J'utilise une regex avec un ^ pour correspondre à un motif au début de la chaîne. Le problème est que si le motif est trouvé au début de toute ligne em> dans la chaîne, il correspond toujours. C'est le comportement que je m'attendrais si j'utilisais le modificateur 'M', mais je ne suis pas: Qu'est-ce que je fais mal ici? P> p>
4 Réponses :
"^" est le début de la ligne. Pour faire ce que vous voulez, vous pouvez scinder de la chaîne et tester juste la première ligne. Mais je pense qu'il existe une meilleure méthode.
Utiliser Ruby Regex Référence: http://www.zenspider.com/Ruby/QuickRef .html # Regexen P> \ A code> au lieu de
^ code>. p>
Votre confusion est justifiée. Dans la plupart des saveurs de regex, Pour ajouter à la confusion, Ruby a quelque chose qu'il appelle le mode "multiligne", mais c'est vraiment ce que tout le monde appelle le mode "mono-line" ou "dotall": il modifie la signification du ^ code> équivaut à
\ a code> et
$ code> est équivalent à
\ z code> par défaut et Vous devez définir le drapeau "multilignes" pour les faire prêter sur leurs autres significations (c.-à-d. limites de la ligne). Dans Ruby,
^ code> et
$ code> toujours em> match aux limites de la ligne. P>
. code > Metacharacter, ce qui lui permet de correspondre à des caractères de séparateur de ligne (par exemple,
\ r code>,
\ n code>) ainsi que tous les autres caractères. P>
Quelles saveurs de regex ont le comportement que vous décrivez?
@Wayne: Toutes les autres arômes de dérivé Perl-dérivé fonctionnent de cette façon: Perl, PHP, Python, JavaScript, Java, .net ... S'il a un mode "Multiline", c'est ce que cela signifie: ^ code > devient "début de la ligne" et
$ code> devient "fin de ligne". Je ne dis pas que l'approche de Ruby est fausse, BTW; Je souhaite juste qu'ils n'aient pas mélangé les noms comme ils l'ont fait. La seule saveur qui le fait vraiment bien est la perl 6 / perroquet, qui élimine les modes "multilignes" et i> "mono-ligne".
Oui, je suis habitué à regex dans c et perl qui utilisent ^ de la même manière que Ruby utilise \ a. Je pensais que la bibliothèque C Regex était la «définitive» - clairement, je me suis trompé. Merci pour vos réponses.
Cette réponse a été ajoutée au FAQ d'expression régulière de pile , sous "Modificateurs".
C'est de loin la meilleure réponse, car il explique également la confusion qui frappera la plupart des programmeurs qui apprennent à rubis et qui connaissent déjà la regex dans d'autres langues.
Excellente ressource ... Rubular.com