Pergunta

Usando Ruby, como eu posso usar um único regex para coincidir com todas as ocorrências de 'y' em "xy y ay xy + y" que não são precedidas de x (y, ay, + y)?
/ [^ X] y / corresponde ao caractere precedente também, então eu preciso de uma alternativa ...

Foi útil?

Solução

Você precisa de um de largura zero negativo afirmação olhar-behind. Tente /(?<!x)y/ que diz exatamente o que você está procurando, ou seja, encontrar todos 'y' não precedido por 'x', mas não inclui o personagem anterior, que é a parte de largura zero.

Editado para acrescentar:. Aparentemente, isso só é suportado a partir de Ruby 1.9 e para cima

Outras dicas

Negative olhar-behind não é suportado até Ruby 1.9, mas você pode fazer algo semelhante usando varredura:

"xy y ay xy +y".scan(/([^x])(y)/) # => [[" ", "y"], ["a", "y"], ["+", "y"]]
"xy y ay xy +y".scan(/([^x])(y)/).map {|match| match[1]}  # => ["y", "y", "y"]

Claro, isso é muito mais difícil se você quiser evitar muito mais do que um único caractere antes do y. Então você teria que fazer algo como:

"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}  # => [[" ", "y"], [" ball", "y"], [" +", "y"]]
"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}.map {|match| match[1]}  # => ["y", "y" "y"]

Rubi infelizmente não suporta lookbehind negativa, então você vai ter problemas se você precisa olhar para mais do que um único personagem. Por apenas um personagem, você pode cuidar do presente, capturando o jogo:

/[^x](y)/

Em PCRE, você usa um negativo olhar-behind:

(:<!x)y

Não sei se isso é suportado por Ruby, mas você pode sempre olhar para cima.

Pode ser feito com para trás olhar negativo, (?<!x)y

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top