9
votes

RUBY REGEX: ^ Matchs Début de la ligne Même sans modificateur M?

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 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: xxx

Qu'est-ce que je fais mal ici?


1 commentaires

Excellente ressource ... Rubular.com


4 Réponses :


2
votes

"^" 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. XXX


0 commentaires

23
votes
  • début de la ligne: ^
  • bout de la ligne: $
  • Début de la chaîne: \ A
  • fin de la chaîne: \ z

0 commentaires

17
votes

Utiliser \ A au lieu de ^ .

Ruby Regex Référence: http://www.zenspider.com/Ruby/QuickRef .html # Regexen


0 commentaires

12
votes

Votre confusion est justifiée. Dans la plupart des saveurs de regex, ^ équivaut à \ a et $ est équivalent à \ z 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, ^ et $ toujours match aux limites de la ligne.

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 . Metacharacter, ce qui lui permet de correspondre à des caractères de séparateur de ligne (par exemple, \ r , \ n ) ainsi que tous les autres caractères.


5 commentaires

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: ^ devient "début de la ligne" et $ 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 "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.