En utilisant Ruby, comment puis-je utiliser une seule regex pour correspondre à toutes les occurrences de 'y' dans "xy y ay xy + y" qui ne sont pas précédées de x (y, ay, + y)?
/[^ x] y/correspond au caractère précédent, donc je besoin d'une alternative ...regexp pour faire correspondre string1 sauf précédé par string2
Répondre
Vous avez besoin d'une assertion avec rétroaction négative de largeur nulle. Essayez /(?<!x)y/
qui indique exactement ce que vous recherchez, c'est-à-dire trouvez tout 'y' non précédé de 'x', mais n'inclut pas le caractère précédent, qui est la partie de largeur nulle.
Edité pour ajouter: Apparemment, ceci n'est supporté que par Ruby 1.9 et plus.
En PCRE, vous utilisez un look derrière négatif:
(:<!x)y
Je ne sais pas si cela est soutenu par Ruby, mais vous pouvez toujours chercher.
Il peut être fait avec un regard négatif derrière, (?<!x)y
Ruby ne supporte pas malheureusement lookbehind négatif, alors vous aurez du mal si vous avez besoin de chercher plus d'un seul caractère. Pour un seul caractère, vous pouvez prendre soin de ce en capturant le match:
/[^x](y)/
Ah, je ne suis pas un expert de Ruby - jbourque dit que lookbehind négatif est dans Ruby plus récent. Il y a ta vraie réponse. – Cascabel
[^ x] doit correspondre à un caractère. si y se trouve au début de la ligne, nous devrions le faire correspondre:/(?: \ A |^| [^ x]) y / –
regarder en arrière négatif est pas prise en charge jusqu'à Ruby 1.9, mais vous pouvez faire quelque chose de similaire en utilisant 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 auriez à 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"]
- 1. Comment faire correspondre un mot entier précédé d'un onglet?
- 2. Regex pour faire correspondre "tout sauf" une chaîne
- 3. Regexp: comment supprimer tout sauf un autre regexp?
- 4. comment faire correspondre quelque chose avec RegExp entre roundbrackets
- 5. Regexp pour faire correspondre des nombres et des unités dans un fragment HTML?
- 6. Pour faire correspondre une figure dans $ _GET par PHP
- 7. SQL produit par Entity Framework pour faire correspondre la chaîne
- 8. Regex pour faire correspondre plusieurs chaînes
- 9. Quelle est la version la plus compacte de "faire correspondre tout sauf ces chaînes" dans le shell ou regex?
- 10. Regex pour faire correspondre la chaîne entre%
- 11. Comment faire pour faire correspondre le filtre Microsoft.Matrix au canevas?
- 12. Java regex pour correspondre à "t" sauf quand il est "[t" ou "t]"
- 13. Comment "faire correspondre" avec regex?
- 14. RegEx - Faire correspondre un ensemble de mots
- 15. Regex pour correspondre à tous sauf une chaîne entre guillemets dans C#
- 16. Tables Regex comment faire correspondre?
- 17. sélecteur css pour faire correspondre un élément sans attribut x
- 18. Regex pour faire correspondre des sous-chaînes uniques
- 19. Regex pour faire correspondre les fractions sloppy/nombres mélangés
- 20. RegEx pour faire correspondre 123.45 et E123.4 et V12.34
- 21. Une question JavaScript RegExp
- 22. mySQL Regexp avec des crochets
- 23. Regexp pour interpréter littéralement \ t comme \ t et non tab
- 24. javascript regex pour faire correspondre les caractères entre deux chaînes
- 25. J'ai besoin d'un regEx pour faire correspondre les URLs générales
- 26. Expression régulière pour correspondre à la chaîne commençant par "stop"
- 27. RegExp C# et richtextbox
- 28. besoin REGEXP Matching dans MySQL
- 29. Regex pour correspondre name1.name2 [.name3]
- 30. Comment faire correspondre avec javascript et regex?
J'allais suggérer un regard en arrière négatif, mais il semble que vous êtes hors de la chance sur ce point: http://www.regular-expressions.info /lookaround.html#limitbehind. * "Enfin, les saveurs comme JavaScript, Ruby et Tcl ne supportent pas du tout lookbehind, même si elles supportent lookahead." * –
Voir aussi http://stackoverflow.com/questions/530441/how-would-you-use- a-regular-expression-to-ignore-string-that-contain-a-specific – finnw
Si les assertions look-behind ne sont pas supportées, on peut utiliser ceci: '([^ x] y") | (^ y ")' . 'y' peut apparaître au début de la chaîne et ce cas n'est pas couvert par '/ [^ x] y /'. – approxiblue