Thread View: pl.comp.lang.ruby
9 messages
9 total messages
Started by Maciej Pilichowski
Sat, 18 Nov 2006 17:20
Jak zamienic regexpem znak na backslash i ten sam znak
Author: Maciej Pilichowski
Date: Sat, 18 Nov 2006 17:20
Date: Sat, 18 Nov 2006 17:20
18 lines
1355 bytes
1355 bytes
Hej, Potrzebne mi to do korygowania nazwa plikow -- unix. Przenioslem kod z perla return filename.gsub(/([\;\!\&\%\$\' ])/,'\\\1') tyle, ze ruby ma chyba jakies problemy z interpretacja backshalshy w takim ustawieniu. Jesli wstawie spacje w srodek \\ \1 to zamienia mi kazdy znak na backshlash, spacje i ten znak. Ale jak wykonac to zgodnie z moja intencja? milego dnia zycze hej -- Maciej "MACiAS" Pilichowski http://bantu.fm.interia.pl/
Re: Jak zamienic regexpem znak na backslash i ten sam znak
Author: Wojciech Piekutowski
Date: Sun, 19 Nov 2006 15:36
Date: Sun, 19 Nov 2006 15:36
26 lines
1857 bytes
1857 bytes
Hej,
Za bardzo nie wiem co ten gsub miałby dokładnie robić, ale spróbujmy:)
Za dużo znaków poprzedziłeś backslashem. Sprawdź Regex.escape.
Regexp.escape(";!&%$' ") => ";!&%\\$'\\ "
(nie wiem dlaczego spacja została poprzedzona backslashem, ale reszta
zgadza się)
Tak naprawdę znaki tworzące klasę znaku - pomiędzy [] - nie potrzebują
backslashy - zawsze są traktowane 'dosłownie'.
Twoje wyrażenie powinno wyglądać prawdopodobnie tak:
/([;!&%$' ])/
Jeśli tworzysz String za pomocą '' to pamiętaj, że tylko znak ' i \
trzeba poprzedzić backslashem, reszta jest traktowana dosłownie, np. \n
na konsoli pojawi się jako \n a nie nowa linia. Dlatego jak wstawiłeś
spację pomiędzy \\ i \1 to dostawałeś \ + to co pasowało do wyrażenia.
Podsumowując:
return filename.gsub(/([;!&%$' ])/,'\1')
To jednak niczego nie zmienia w nazwie pliku, ale może jakoś
naprowadziłem Cię na właściwy trop:)
Pozdrawiam,
Wojciech Piekutowski
Re: Jak zamienic regexpem znak na backslash i ten sam znak
Author: Wojciech Piekutowski
Date: Mon, 20 Nov 2006 08:31
Date: Mon, 20 Nov 2006 08:31
16 lines
1299 bytes
1299 bytes
Hej, Chyba już wiem o co Ci chodziło. Jak człowiek się prześpi od razu inaczej patrzy na sprawę:) Zapewne chodzi Ci o return filename.gsub(/([;!&%$' ])/,'\\\1') To zastąpi każdy match \ + match. W irb dostaniesz np. "\\;" ale to jest ok, ponieważ \ musi być poprzedzony \. Zrób puts filename.gsub(/([;!&%$' ])/,'\\\1') aby się przekonać czy działa. Pozdrawiam, Wojciech Piekutowsk
Re: Jak zamienic regexpem znak na backslash i ten sam znak
Author: Maciej Pilichowski
Date: Mon, 20 Nov 2006 12:59
Date: Mon, 20 Nov 2006 12:59
13 lines
1415 bytes
1415 bytes
On Mon, 20 Nov 2006 09:31:38 +0100, Wojciech Piekutowski <w.piekutowski@gmail.com> wrote: >return filename.gsub(/([;!&%$' ])/,'\\\1') Jak sie okazalo nie 3 \ ale ... 5 \ Tylko nie wiem jakie jest sensowne uzasadnienie. RubyCentral podaje, ze tak ma byc i koniec, ale nie przekonuje mnie taka argumentacja. milego dnia zycze hej -- Maciej "MACiAS" Pilichowski http://bantu.fm.interia.pl/
Re: Jak zamienic regexpem znak na backslash i ten sam znak
Author: Viqq
Date: Mon, 20 Nov 2006 13:42
Date: Mon, 20 Nov 2006 13:42
18 lines
1578 bytes
1578 bytes
Maciej Pilichowski wrote: > On Mon, 20 Nov 2006 09:31:38 +0100, Wojciech Piekutowski > <w.piekutowski@gmail.com> wrote: > > >>return filename.gsub(/([;!&%$' ])/,'\\\1') > > > Jak sie okazalo nie 3 \ ale ... 5 \ Tylko nie wiem jakie jest sensowne > uzasadnienie. RubyCentral podaje, ze tak ma byc i koniec, ale nie > przekonuje mnie taka argumentacja. 5, nie 3, bo masz dwa interpretery: rubyowy i regexpowy najpierw ruby bierze stringa na warsztat: \\\\\1 -> \\\1 potem regexp bierze stringa na warsztat: \\\1 -> \1 no, to tak imho
Re: Jak zamienic regexpem znak na backslash i ten sam znak
Author: Jaroslaw Zabiello
Date: Mon, 20 Nov 2006 13:47
Date: Mon, 20 Nov 2006 13:47
32 lines
1767 bytes
1767 bytes
Dnia Mon, 20 Nov 2006 13:59:14 +0100, Maciej Pilichowski napisał(a):
>>return filename.gsub(/([;!&%$' ])/,'\\\1')
>
> Jak sie okazalo nie 3 \ ale ... 5 \ Tylko nie wiem jakie jest sensowne
> uzasadnienie. RubyCentral podaje, ze tak ma byc i koniec, ale nie
> przekonuje mnie taka argumentacja.
Masz rację. To wygląda ewidentnie na błąd w Ruby, bo w Pythonie jest OK
>>> import re
>>> for f in ['pl;ik', 'pl ik', 'pl!ik']:
... print re.sub(r"([;!&%$' ])", r'\\\1', f)
...
pl\;ik
pl\ ik
pl\!ik
Zamiast mnożyć backslashe możesz też użyć Regexp#escape, ale to tylko
monkey patching.
for f in ['pl;ik', 'pl ik', 'pl!ik']
puts f.gsub(/([;!&%$' ])/, '\\\\'+'\1')
#puts f.gsub(/([;!&%$' ])/,Regexp.escape('\\')+'\1') # tak też można
end
pl\;ik
pl\ ik
pl\!ik
--
Jarosław Zabiełło
http://blog.zabiello.com
Re: Jak zamienic regexpem znak na backslash i ten sam znak
Author: Jaroslaw Zabiello
Date: Mon, 20 Nov 2006 13:50
Date: Mon, 20 Nov 2006 13:50
10 lines
1142 bytes
1142 bytes
Dnia Sun, 19 Nov 2006 16:36:51 +0100, Wojciech Piekutowski napisał(a):
> Za dużo znaków poprzedziłeś backslashem. Sprawdź Regex.escape.
> Regexp.escape(";!&%$' ") => ";!&%\\$'\\ "
Po co? W ogóle nie trzeba żadnych backslashy: /([;!&%$' ])/
--
Jarosław Zabiełło
http://blog.zabiello.com
Re: Jak zamienic regexpem znak na backslash i ten sam znak
Author: Wojciech Piekutowski
Date: Mon, 20 Nov 2006 20:46
Date: Mon, 20 Nov 2006 20:46
6 lines
1131 bytes
1131 bytes
Mógłbym przysiądz, że 3 backslashe zadziałały... Dziwne;) W każdym razie dobrze, że działa tak jak chciałeś:) Pozdrawiam, Wojciech Piekutowski
Re: Jak zamienic regexpem znak na backslash i ten sam znak
Author: Maciej Pilichowski
Date: Tue, 21 Nov 2006 17:08
Date: Tue, 21 Nov 2006 17:08
21 lines
1669 bytes
1669 bytes
On Mon, 20 Nov 2006 14:42:00 +0100, Viqq <viqq@gazeta.pl> wrote: >5, nie 3, bo masz dwa interpretery: rubyowy i regexpowy >najpierw ruby bierze stringa na warsztat: >\\\\\1 -> \\\1 >potem regexp bierze stringa na warsztat: >\\\1 -> \1 >no, to tak imho Oczywiscie zgodzilbym sie, gdyby to dzialalo zawsze -- porownaj z \\ \1 dziala to zgodnie ze zdrowym rozsadkiem, ale jesli przyjac za dobra monete ten dwukrotny parsing, to pytanie, ktory zostal w tym przypadku wylaczony? milego dnia zycze hej -- Maciej "MACiAS" Pilichowski http://bantu.fm.interia.pl/
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads