From: Amishera Amishera on
I have strings of this form:

s = 'C#039;era una volta il east'

I want to replace '#039;' with the octal representation of 39 ie 47 so
the string becomes

s = 'C\47era una volta il east'

I have tried this:

1 def conv_char(num)
2 puts num.to_i.to_s(8)
3 num.to_i.to_s(8)
4 end
5
6 if __FILE__ == $0
7 s = 'C#039;era'
8 s.gsub!(/#(\d+);/, conv_char("\1"))
9 puts s
10 end

The outptu i get is
0
'C#0era una volta il east'

I even tried
8 s.gsub!(/#(\d+);/, conv_char('\1'))
8 s.gsub!(/#(\d+);/, conv_char($1))

nothing seems to work.

how to solve this gracefully? I guess I can do that using double
replacement like collecting the matched patterns (#039;) using scan
method and then converting and doing another gsub using a for loop. But
that seems to much for the poor regular expression engine.
--
Posted via http://www.ruby-forum.com/.

From: Amishera Amishera on
Amishera Amishera wrote:
> I have strings of this form:
>
> s = 'C#039;era una volta il east'
>
> I want to replace '#039;' with the octal representation of 39 ie 47 so
> the string becomes
>
> s = 'C\47era una volta il east'
>
> I have tried this:
>
> 1 def conv_char(num)
> 2 puts num.to_i.to_s(8)
> 3 num.to_i.to_s(8)
> 4 end
> 5
> 6 if __FILE__ == $0
> 7 s = 'C#039;era'
> 8 s.gsub!(/#(\d+);/, conv_char("\1"))
> 9 puts s
> 10 end
>
> The outptu i get is
> 0
> 'C#0era una volta il east'
>
> I even tried
> 8 s.gsub!(/#(\d+);/, conv_char('\1'))
> 8 s.gsub!(/#(\d+);/, conv_char($1))
>
> nothing seems to work.
>
> how to solve this gracefully? I guess I can do that using double
> replacement like collecting the matched patterns (#039;) using scan
> method and then converting and doing another gsub using a for loop. But
> that seems to much for the poor regular expression engine.

I can do this also:

s.gsub!(/#(\d+);/) { puts $1; conv_char($1) }

But I was wondering how to use both the \1 syntax and the function call
together in the gsub call in the first approach.
--
Posted via http://www.ruby-forum.com/.

From: Amishera Amishera on
Amishera Amishera wrote:

> I can do this also:
>
> s.gsub!(/#(\d+);/) { puts $1; conv_char($1) }
>
> But I was wondering how to use both the \1 syntax and the function call
> together in the gsub call in the first approach.

Okay it did solve half of the problem. Other half is how to display a
'\' infront.

s.gsub!(/#(\d+);/) { '\'+$1.to_i.to_s(8)}

is giving some compile error.
--
Posted via http://www.ruby-forum.com/.

From: David Springer on
[Note: parts of this message were removed to make it a legal post.]

On Wed, Mar 31, 2010 at 6:13 PM, Max Schmidt <
max.schmidt.privat(a)googlemail.com> wrote:

> >s.gsub!(/#(\d+);/) { '\'+$1.to_i.to_s(8)}
>
> >is giving some compile error.
>
> You have to escape the slash (\) like this
>
> >s.gsub!(/#(\d+);/) { '\\'+$1.to_i.to_s(8)}
> --
> Posted via http://www.ruby-forum.com/.
>
>
try either of these:

s.gsub!(/#(\d+);/, "\134\134#{conv_char($)}")

s.gsub!(/#(\d+);/, "\134\134#{$1.to_i.to_s(8)}")

--
David

From: David Springer on

OK I was wrong. This does work.

s.gsub!(/#(\d+);/) { '\\'+$1.to_i.to_s(8)}

What I offered does not.
--
Posted via http://www.ruby-forum.com/.