Question

Avec Ruby, comment utiliser une seule expression rationnelle pour correspondre à toutes les occurrences de 'y' dans & "xy y ay xy + y &"; qui ne sont PAS précédés de x (y, ay, + y)?
/ [^ x] y / correspond au caractère précédent aussi, donc il me faut une alternative ...

Était-ce utile?

La solution

Vous avez besoin d'une assertion de regard négatif de largeur nulle. Essayez /(?<!x)y/ qui dit exactement ce que vous cherchez, c’est-à-dire que tous les «y» ne sont pas précédés de «x», mais n’incluent pas le caractère précédent, qui correspond à la partie de largeur nulle.

Modifié pour ajouter: Apparemment, cela n'est supporté que par Ruby 1.9 et supérieur.

Autres conseils

Le look-behind négatif n'est pas pris en charge avant Ruby 1.9, mais vous pouvez faire quelque chose de similaire à l'aide de scan:

"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"]

Bien sûr, c'est beaucoup plus difficile si vous voulez éviter beaucoup plus qu'un seul caractère avant le y. Ensuite, vous devrez faire quelque chose comme:

"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"]

Malheureusement, Ruby ne prend pas en charge les recherches négatives. Vous aurez donc des problèmes si vous devez rechercher plus d’un caractère. Pour un seul personnage, vous pouvez vous en occuper en capturant le match:

/[^x](y)/

Dans PCRE, vous utilisez une recherche négative:

(:<!x)y

Vous ne savez pas si cela est pris en charge par Ruby, mais vous pouvez toujours rechercher.

Cela peut être fait avec un regard négatif derrière, (?<!x)y

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top