L'expression régulière Ruby a-t-elle un opérateur not match comme «! ~» En Perl?

92

Je veux juste savoir si ruby ​​regex a un opérateur not match comme !~dans perl. Je pense que ce n'est pas pratique à utiliser (?!xxx)ou (?<!xxxx)parce que vous ne pouvez pas utiliser de modèles d'expression régulière dans la xxxpièce.

user1793091
la source
8
Tout ce que vous aviez à faire était d'allumer irbet de l'essayer. Cela aurait probablement été plus rapide que de publier une question SO.
Mark Thomas
33
Mais pas plus rapide que de rechercher sur Google `` ruby ​​not match '' et de trouver cette réponse sur SO;)
micapam
3
J'ai expérimenté pendant un moment avant de rester coincé, googler et trouver cette réponse (qui a fonctionné.). Ne jetez jamais sur quelqu'un pour avoir posé une question.
Jonathon Nordquist
2
Il l'a formulé de manière sous-optimale. Ce que je pense qu'il voulait dire était, "souvenez-vous que vous pouvez lancer irbet essayer. Probablement plus rapide, même, que de poster une question SO, et une excellente occasion de tester les choses en général." C'est comme ça que je l' ai entendu, de toute façon.
user2066657

Réponses:

156

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

irb(main):001:0> 'x' !~ /x/
=> false
irb(main):002:0> 'x' !~ /y/
=> true
Konrad Rudolph
la source
8
!~est documenté sous Objet .
Tonči D.
3
Avec ruby ​​2.4, il y a aussi la syntaxe un peu plus agréable RegExp#match?, que vous pouvez facilement annuler. Selon les notes de publication , il fait encore moins d'allocations que!~
panmari
6

AFAIK (?! Xxx) est pris en charge:

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
Calfzhou
la source
C'est une solution de niveau inférieur. Il n'est pas toujours facile de convertir des expressions rationnelles de cette façon. D'autre part, cette solution ne dépend pas du langage de programmation de haut niveau;)
Konstantin
0

De retour en perl, 'foobar' !~ /bar/c'était parfaitement perlish 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 spiffy s'il y avait une .no_match?méthode.

David Hempy
la source