Używając Ruby, w jaki sposób mogę użyć pojedynczego wyrażenia regularnego do dopasowania wszystkich wystąpień "y" w "xy yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy)" y)?
/[^ x] y/dopasowuje poprzedni charakter zbyt, więc muszę mieć alternatywę ...regexp, aby dopasować ciąg1, chyba że poprzedzi go ciąg2
Odpowiedz
Potrzebujesz negatywnej opinii o zerowej szerokości. Wypróbuj /(?<!x)y/
, która mówi dokładnie to, czego szukasz, tj. Znajdź cały "y" nie poprzedzony przez "x", ale nie zawiera poprzedniego znaku, który jest częścią o zerowej szerokości.
Edytowany w celu dodania: Wygląda na to, że jest to obsługiwane tylko w Rubim 1.9 i wyżej.
W PCRE, należy użyć negatywny wygląd opóźnieniem:
(:<!x)y
nie wiem, czy jest to obsługiwane przez Ruby, ale zawsze możesz spojrzeć w górę.
To można zrobić z negatywną wygląd tyłu, (?<!x)y
Ruby niestety nie obsługuje negatywny lookbehind, więc będziesz mieć problemy, jeśli trzeba spojrzeć na więcej niż jednego znaku. Tylko dla jednej postaci, można zadbać o to poprzez przechwytywanie meczu:
/[^x](y)/
Ah, nie jestem ekspertem od Ruby - jbourque mówi, że negatywny lookbehind jest w nowszej Ruby. Oto twoja prawdziwa odpowiedź. – Cascabel
[^ x] musi pasować do jednego znaku. jeśli y pojawi się na początku linii, powinniśmy ją dopasować:/(?: \ A |^| [^ x]) y / –
Negative look-tył nie jest obsługiwana aż Ruby 1.9, ale można zrobić coś podobnego przy użyciu skanowania:
"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"]
Oczywiście jest to znacznie trudniejsze, jeśli chcesz uniknąć znacznie więcej niż jednej postaci przed y
. Wtedy musielibyśmy zrobić coś w rodzaju:
"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. Zaktualizuj atrybuty, chyba że puste?
- 2. RegExp - Jak mogę dopasować najkrótszą możliwą kwotę?
- 3. MySql REGEXP dopasować dwie oddzielone przecinkami ciągi
- 4. Regex, aby dopasować symbole:! $%^& *() _ + | ~ - = `{} []:"; '<>?,./
- 5. Skaluj obraz, aby dopasować go do strony A4 - Migradoc
- 6. iTextSharp: Jak zmienić rozmiar obrazu, aby dopasować go do rozmiaru?
- 7. Wykonywanie podobieńców dopasowań podciąć, chyba że inny podciąg pasuje do
- 8. Wyrażenie regularne, aby dopasować C plik #include
- 9. REGEXP, aby dopasować ciąg grupy w obrębie innej listy grup bez względu na kolejność - SQL
- 10. MySQL SELECT LIKE lub REGEXP, aby dopasować wiele słów w jednym rekordzie
- 11. Jak dopasować znak zapytania "?" jako regexp w lokalizacji nginx.conf
- 12. Skróć NSString, aby dopasować rozmiar?
- 13. geom_density, aby dopasować geom_histogram binwitdh
- 14. 405 przy użyciu AttributeRouting.PUTAttribute, chyba że włączam również HttpPutAttribute
- 15. Regex: Dopasuj adres IP, chyba że jest poprzedzony określonymi znakami?
- 16. formularz Django z BooleanField zawsze nieważna, chyba że zaznaczone
- 17. Sprężyna nie akceptuje parametru POST, chyba że @RequestParam "required = false"
- 18. Jak używać RegExp Zastąpić, aby zastąpić zdanie?
- 19. Regex, aby dopasować określoną grupę cyfr o określonej długości?
- 20. C# rodzajowych, porównując 2 ciągi fail chyba że wyraźnie określono
- 21. Przejścia CSS nie działają, chyba że używam limitu czasu
- 22. Flume nie zapisuje do HDFS, chyba że zostanie zabity
- 23. Zgłoszenie zatrzymania Jquery należy przesłać, chyba że zaznaczono pole wyboru:
- 24. nie można skompilować modułów zewnętrznych, chyba że podano flagę "--module"
- 25. TelemetryClient nie wysyła żadnych danych, chyba że Flush nazywa się
- 26. WebRequest.GetResponse trwa długo, chyba że DefaultWebProxy ma wartość zerową
- 27. Używanie Linq, chyba że nie działa tak jak myślałem
- 28. Negatywna podpowiedź PHP Regexp
- 29. Wyrażenie regularne PHP, aby dopasować słowa
- 30. Jak zmienić rozmiar obrazu, aby dopasować go do obszaru Obraz :: Magia?
Miałem zamiar zaproponować negatywny lookbehind, ale wygląda na to, że nie masz szczęścia na ten wynik: http://www.regular-expressions.info /lookaround.html#limitbehind. * "Wreszcie, smaki takie jak JavaScript, Ruby i Tcl nie obsługują w ogóle lookbehind, nawet jeśli obsługują uprzedzenie". * –
Zobacz także http://stackoverflow.com/questions/530441/how-would-you-use- a-regular-expression-to-ignore-string-that-contain-a-specific – finnw
Jeśli asercje nie są obsługiwane, możemy użyć tego: '([^ x] y") | (^ y ")' . "y" może pojawić się na początku łańcucha, a ten przypadek nie jest objęty '/ [^ x] y /'. – approxiblue