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.