A expressão regular do Ruby tem um operador não compatível como “! ~” Em Perl?


92

Eu só quero saber se ruby ​​regex tem um operador não correspondente, assim como !~em perl. Acho que é inconveniente de usar (?!xxx)ou (?<!xxxx)porque você não pode usar padrões regex na xxxparte.


8
Tudo o que você precisava fazer era ligar irbe tentar. Provavelmente teria sido mais rápido do que postar uma pergunta SO.
Mark Thomas

32
Mas não mais rápido do que pesquisar 'ruby não corresponde' e encontrar essa resposta no SO;)
micapam

3
Eu experimentei por um tempo antes de ficar preso, pesquisando no Google e encontrando essa resposta (que funcionou.). Nunca desista de alguém por fazer uma pergunta.
Jonathon Nordquist

2
Ele formulou de forma subótima. O que acho que ele quis dizer foi: "lembre-se de que você pode iniciar irbe experimentar. Provavelmente mais rápido do que postar uma pergunta SO, e uma ótima oportunidade de testar as coisas em geral." Pelo menos foi assim que ouvi.
user2066657

Respostas:


156

Sim: !~funciona muito bem - você provavelmente pensou que não, porque está faltando na página de documentação doRegexp . No entanto, funciona:

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

8
!~está documentado em Objeto .
Tonči D.

3
Com ruby ​​2.4, há também uma sintaxe um pouco mais agradável RegExp#match?, que você pode facilmente negar. De acordo com as notas de lançamento , ele faz ainda menos alocações do que!~
panmari

6

AFAIK (?! Xxx) é compatível:

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

É uma solução de nível inferior. Nem sempre é fácil converter expressões regulares dessa maneira. Por outro lado, esta solução não depende de linguagem de programação de nível superior;)
Konstantin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.