112 votes

L'expression régulière Ruby possède-t-elle un opérateur de non-correspondance comme "!~" en Perl ?

Je veux juste savoir si ruby regex a un opérateur de non-correspondance comme !~ en perl. Je pense qu'il est peu pratique d'utiliser (?!xxx) o (?<!xxxx) parce que vous ne pouvez pas utiliser de motifs regex dans le champ xxx partie.

8 votes

Tout ce que vous aviez à faire était d'allumer irb et l'essayer. Cela aurait probablement été plus rapide que de poster une question sur l'OS.

35 votes

Mais ce n'est pas plus rapide que de googler 'ruby not match' et de trouver cette réponse sur SO ;)

3 votes

J'ai expérimenté pendant un certain temps avant de me retrouver coincé, de chercher sur Google et de trouver cette réponse (qui a fonctionné). Ne vous défoulez jamais sur quelqu'un qui pose une question.

186voto

Konrad Rudolph Points 231505

Oui : !~ fonctionne très bien - vous avez probablement pensé que ce ne serait pas le cas car il est absent de la page de documentation de Regexp . Néanmoins, cela fonctionne :

irb(main):001:0> 'x' !~ /x/
=> false
irb(main):002:0> 'x' !~ /y/
=> true

10 votes

!~ est documenté sous Objet .

4 votes

Avec ruby 2.4, il y a aussi la syntaxe un peu plus agréable RegExp#match? ce que vous pouvez facilement nier. Selon le notes de mise à jour il effectue encore moins d'allocations que !~

8voto

calfzhou Points 151

AFAIK (?!xxx) est supporté :

2.1.5 :021 > 'abc1234' =~ /^abc/
 => 0
2.1.5 :022 > 'def1234' =~ /^abc/
 => nil
2.1.5 :023 > 'abc1234' =~ /^(?!abc)/
 => nil
2.1.5 :024 > 'def1234' =~ /^(?!abc)/
 => 0

0 votes

C'est une solution de niveau inférieur. Il n'est pas toujours facile de convertir des regexps de cette manière. D'un autre côté, cette solution ne dépend pas du langage de programmation de haut niveau ;)

0voto

David Hempy Points 1199

Retour en perl, 'foobar' !~ /bar/ était tout à fait normal de tester que la chaîne ne contient pas "bar".

En Ruby, en particulier avec un guide de style moderne, je pense qu'une solution plus explicite est plus conventionnelle et facile à comprendre :

input = 'foobar'

do_something unless input.match?(/bar/) 

needs_bar = !input.match?(/bar/)

Cela dit, je pense que ce serait bien s'il y avait un .no_match? méthode.

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