20 votes

Rubis : Quelle est la syntaxe correcte pour une méthode booléenne de regex ?

Quelle est la syntaxe correcte d'une méthode qui vérifie la présence d'un motif dans une chaîne de caractères et renvoie un message vrai ou faux si l'expression rationnelle correspond ?

L'idée de base :

def has_regex?(string)
    pattern = /something/i
    return string =~ pattern
end

Cas d'utilisation :

if has_regex?("something")
    # woohoo
else
    # nothing found: panic!
end

46voto

Ryan Points 1714

Dans la question, vous avez dit :

... méthode qui vérifie la présence d'un motif dans une chaîne de caractères et renvoie un message vrai ou faux si l'expression rationnelle correspond.

Comme johannes a souligné String=~ renvoie à nil si le motif ne correspond pas et la position dans la chaîne où se trouve le mot correspondant sinon. Il ajoute qu'en Ruby, tout sauf nil y false se comporter comme true . Tout cela est juste.

Cependant, ils ne sont pas exactement true o false . Par conséquent, la dernière étape consiste à contraindre la valeur à être un Boolean . Pour ce faire, le résultat est enveloppé dans une double frange qui renvoie une true .

def has_regex?(string)
    !!(string =~ /something/i)
end

15voto

johannes Points 3878

Votre code semble correct, mais vous pourriez l'écrire encore plus petit.

La valeur de retour de String#=~ se comporte de cette manière :

  • nil si le motif ne correspond pas
  • la position dans la chaîne où le mot correspondant commence

En Ruby, tout sauf nil y false se comporte comme true dans une déclaration conditionnelle afin que vous puissiez simplement écrire

if string=~ pattern
  # do something
else
  # panic
end

11voto

viljar Points 111

Pour qu'il renvoie vrai/faux, changez la position du motif et de la chaîne et utilisez le cas d'égalité ===.

def has_regex?(string)
    pattern = /something/i
    return pattern === string
end

J'avais absolument besoin qu'il renvoie une valeur booléenne vraie et j'ai creusé un peu. C'est en fait documenté dans la classe regexp http://www.ruby-doc.org/core-2.1.3/Regexp.html#method-i-3D-3D-3D

11voto

matthew.tuck Points 1029

Si vous utilisez Ruby 2.4 ou une version plus récente, il y a String#match?(regex) y Regexp#match?(string) qui renvoient des booléens sans les manigances de conversion (lorsque cela est nécessaire, mais généralement pas), et dont les performances sont améliorées.

https://ruby-doc.org/core-2.4.0/Regexp.html#method-i-match-3F

https://blog.cognitohq.com/new-features-in-ruby-2-4/

7voto

Henok T Points 41

Pour Ruby >= 2.4 ou Rails, vous pouvez le faire :

 regexp.match?(string)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X