How to solve this regular expression problem

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.

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.

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.

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)}

On Wed, Mar 31, 2010 at 6:13 PM, Max S. <
[email protected]> wrote:

try either of these:

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

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

OK I was wrong. This does work.

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

What I offered does not.

s.gsub!(/#(\d+);/, “\134\134#{conv_char($)}”)
I meant:
s.gsub!(/#(\d+);/, “\134\134#{conv_char($1)}”)

I’m having trouble doing copy & paste from irb under windows.

David