🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#299
Author: Maciej Pilichowski
Date: Sat, 18 Nov 2006 17:20
18 lines
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
#300
Author: Wojciech Piekutowski
Date: Sun, 19 Nov 2006 15:36
26 lines
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
#301
Author: Wojciech Piekutowski
Date: Mon, 20 Nov 2006 08:31
16 lines
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
#302
Author: Maciej Pilichowski
Date: Mon, 20 Nov 2006 12:59
13 lines
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
#303
Author: Viqq
Date: Mon, 20 Nov 2006 13:42
18 lines
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
#305
Author: Jaroslaw Zabiello
Date: Mon, 20 Nov 2006 13:47
32 lines
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
#307
Author: Jaroslaw Zabiello
Date: Mon, 20 Nov 2006 13:50
10 lines
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
#306
Author: Wojciech Piekutowski
Date: Mon, 20 Nov 2006 20:46
6 lines
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
#304
Author: Maciej Pilichowski
Date: Tue, 21 Nov 2006 17:08
21 lines
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