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.


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

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.