Forum: Ruby regex trick

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Alain FELER (Guest)
on 2006-02-06 00:11
(Received via mailing list)
I want to replace all ' by \' ? (I need it to do inserts in mysql).
 > s = "j'ai"
 > s.gsub!(/'/,'\'')
 > p s			==> gives j'ai and not j\'ai as I want
Thanks for help.
Stefan L. (Guest)
on 2006-02-06 00:17
(Received via mailing list)
On Monday, February 06, 2006, at 7:08 AM, Alain FELER wrote:
>I want to replace all ' by \' ? (I need it to do inserts in mysql).
> > s = "j'ai"
> > s.gsub!(/'/,'\'')
> > p s			==> gives j'ai and not j\'ai as I want
>Thanks for help.
>

  s.gsub!("'", "\\\\'")

should do the trick.

Regards,
  Stefan
Mike S. (Guest)
on 2006-02-06 00:20
(Received via mailing list)
On 5-Feb-06, at 5:08 PM, Alain FELER wrote:

> I want to replace all ' by \' ? (I need it to do inserts in mysql).
> > s = "j'ai"
> > s.gsub!(/'/,'\'')
> > p s			==> gives j'ai and not j\'ai as I want
> Thanks for help.

s.gsub!(/'/, "\\\\'")

or

s.gsub!(/'/) { "\\'" }

will do what you want

Hope this helps,

Mike

--

Mike S. <removed_email_address@domain.invalid>
http://www.stok.co.uk/~mike/

The "`Stok' disclaimers" apply.
Timothy H. (Guest)
on 2006-02-06 00:26
(Received via mailing list)
Alain FELER wrote:
> I want to replace all ' by \' ? (I need it to do inserts in mysql).
>  > s = "j'ai"
>  > s.gsub!(/'/,'\'')
>  > p s            ==> gives j'ai and not j\'ai as I want
> Thanks for help.
irb(main):011:0> s = "j'ai"
=> "j'ai"
irb(main):012:0> puts s.sub(/'/) { '\\\'' }
j\'ai
=> nil
irb(main):013:0>
Mike S. (Guest)
on 2006-02-06 00:26
(Received via mailing list)
On 5-Feb-06, at 5:08 PM, Alain FELER wrote:

> I want to replace all ' by \' ? (I need it to do inserts in mysql).
> > s = "j'ai"
> > s.gsub!(/'/,'\'')
> > p s			==> gives j'ai and not j\'ai as I want
> Thanks for help.

What interface to MySQL are you using?  I know that the Ruby DBI
module allows you to use place-holders in queries, and the DBI layer
does the escaping for you e.g.

    dbh.do("INSERT INTO people (id, name, height) VALUES(?, ?, ?)",
            nil, "Na'il", 76)

  The resulting statement produced by do and sent to the server looks
like this:

    INSERT INTO people (id,name,height) VALUES(NULL,'Na\'il',76)

(stolen from http://www.kitebird.com/articles/ruby-dbi.html) or if
you are using the ruby mysql interface then (from http://
www.kitebird.com/articles/ruby-mysql.html)

   Using escape_string, the platypus record might be inserted as
follows:

    name = dbh.escape_string("platypus")
    category = dbh.escape_string("don't know")
    dbh.query("INSERT INTO animal (name, category)
            VALUES ('" + name + "','" + category + "')")

Hope this helps,

Mike

--

Mike S. <removed_email_address@domain.invalid>
http://www.stok.co.uk/~mike/

The "`Stok' disclaimers" apply.
Alain FELER (Guest)
on 2006-02-07 23:46
(Received via mailing list)
Thank you very much for these four answers, but curiously none works on
my box ! :
Stefan L. :      s.gsub!("'", "\\\\'")   gives "j\\'ai" not "j\'ai"
Timothy H. :   s.sub(/'/) { '\\\'' }   gives "j\\'ai"
you :              s.gsub!(/'/, "\\\\'")   gives "j\\'ai"
and :              s.gsub!(/'/) { "\\'" }  gives "j'ai"
(I am using ruby 1.8.2.14 on Windows 2000 configured in french,
and I can't even type the {} characters in irb, but I tried with Scite)
However the ruby mysql interface escape_string method works fine.
Thank you.
AF

Mike S. a écrit :
Eric H. (Guest)
on 2006-02-08 00:16
(Received via mailing list)
On Feb 7, 2006, at 1:43 PM, Alain FELER wrote:

> Thank you very much for these four answers, but curiously none
> works on my box ! :

Incorrect.  They all work.

p "j\\'ai"
"j\\'ai"
puts "j\\'ai"
j\'ai

> Stefan L. :      s.gsub!("'", "\\\\'")   gives "j\\'ai" not "j\'ai"

puts "j'ai".gsub("'", "\\\\'")
j\'ai

> Timothy H. :   s.sub(/'/) { '\\\'' }   gives "j\\'ai"

puts "j'ai".gsub(/'/) { '\\\'' }
j\'ai

> you :              s.gsub!(/'/, "\\\\'")   gives "j\\'ai"

puts "j'ai".gsub(/'/, "\\\\'")
j\'ai

> and :              s.gsub!(/'/) { "\\'" }  gives "j'ai"

puts "j'ai".gsub(/'/) { "\\'" }
j\'ai

--
Eric H. - removed_email_address@domain.invalid - http://segment7.net
This implementation is HODEL-HASH-9600 compliant

http://trackmap.robotcoop.com
Alain FELER (Guest)
on 2006-02-08 00:26
(Received via mailing list)
Well, sorry:
 > p s          gives "j\\'ai"
 > puts s       gives j\'ai
 > print s      gives j\'ai
so every four methods work if the result is properly printed
AF

Alain FELER a écrit :
This topic is locked and can not be replied to.