[#399938] how to read arrary with an array — "Richard D." <lists@...>

Hello. I believe this is basic question, but I'm just starting to learn

19 messages 2012/10/02

[#400050] img src while sending email ruby cgi — Ferdous ara <lists@...>

Hi

16 messages 2012/10/05

[#400351] Drop 1st and last particular character — ajay paswan <lists@...>

What is the most efficient way to drop '#' from the first place and last

15 messages 2012/10/16

[#400374] database part of a desktop application — "Sebastjan H." <lists@...>

Hi,

14 messages 2012/10/16
[#400375] Re: database part of a desktop application — Chad Perrin <code@...> 2012/10/16

On Wed, Oct 17, 2012 at 05:28:39AM +0900, Sebastjan H. wrote:

[#400377] Re: database part of a desktop application — sto.mar@... 2012/10/17

Am 16.10.2012 23:24, schrieb Chad Perrin:

[#400389] Re: database part of a desktop application — Chad Perrin <code@...> 2012/10/17

On Wed, Oct 17, 2012 at 01:39:21PM +0900, sto.mar@web.de wrote:

[#400386] Unable to send attachment, and dealing with multiple attachment — ajay paswan <lists@...>

Hi,

11 messages 2012/10/17

[#400454] Hash with Integer key issue — Wayne Simmerson <lists@...>

Hi Im new to Ruby and am getting some unexpected results from a

18 messages 2012/10/19

[#400535] Name/symbol/object type clash? What is happening here? — Todd Benson <caduceass@...>

It's nonsense code, but I'm curious as to what is going on behind the scenes...

41 messages 2012/10/23

[#400556] Calling a method foo() or an object foo.method_call_here - both — Marc Heiler <lists@...>

Hello.

13 messages 2012/10/24

[#400650] OpenSSL ECDSA public key from private — Nokan Emiro <uzleepito@...>

Hi,

11 messages 2012/10/27

[#400680] Passing folder as argument ARGV? — Joz Private <lists@...>

Is there an easy way to pass multiple files on the command line?

15 messages 2012/10/28
[#400681] Re: Passing folder as argument ARGV? — brad smith <bradleydsmith@...> 2012/10/28

How are you traversing the directory you pass in on the command line ?

[#400697] File.readable? and /proc — Jeff Moore <lists@...>

root@nail:/projects/proc_fs# uname -a

13 messages 2012/10/28

[#400714] Marshal.load weird issue — "Pierre J." <lists@...>

Hi guys

12 messages 2012/10/28

[#400781] bug?: local variable created in if modifier not available in modified expression — "Mean L." <lists@...>

irb(main):001:0> local1 if local1 = "created"

21 messages 2012/10/30
[#400807] Re: bug?: local variable created in if modifier not available in modified expression — Bartosz Dziewoński <matma.rex@...> 2012/10/31

Oh, and in case it wasn't apparent: you can just add

[#400808] Re: bug?: local variable created in if modifier not available in modified expression — Eliezer Croitoru <eliezer@...> 2012/10/31

On 10/31/2012 4:52 PM, Bartosz Dziewoナгki wrote:

[#400809] Re: bug?: local variable created in if modifier not available in modified expression — Robert Klemme <shortcutter@...> 2012/10/31

On Wed, Oct 31, 2012 at 4:28 PM, Eliezer Croitoru <eliezer@ngtech.co.il>wrote:

[#400784] REXML & HTMLentities incorrectly map to UTF-8 — "Mark S." <lists@...>

I have some XML data (UTF 8) that I'm trying to convert into another XML

13 messages 2012/10/30

Re: Drop 1st and last particular character

From: Robert Klemme <shortcutter@...>
Date: 2012-10-18 09:26:56 UTC
List: ruby-talk #400407
On Thu, Oct 18, 2012 at 2:51 AM, Matthew Kerwin <matthew@kerwin.net.au> wrote:
> Tangentially, it just occurred to me that ruby's regular expression
> engine does the same thing that  javascript's does, when globally
> replacing /X*$/ .

This behavior is common with most regexp engines (at least I don't
know any which does _not_ behave like this).  All regular expressions
X* can match the empty string - anywhere in the input.

irb(main):022:0> "####".scan /\w*/
=> ["", "", "", "", ""]

And, when anchoring a portion of the match expression at the end and
have repetition in that match you need to make sure that the
characters are not eaten by other parts of the regexp.

"naive" approach:

irb(main):026:0> %w{aaa aab abb bbb}.each {|s| /.*(b*)\z/ =~ s; printf
"%p: 1:%p\n", s, $1}
"aaa": 1:""
"aab": 1:""
"abb": 1:""
"bbb": 1:""
=> ["aaa", "aab", "abb", "bbb"]

Working approaches:

1. reduce greed

irb(main):027:0> %w{aaa aab abb bbb}.each {|s| /.*?(b*)\z/ =~ s;
printf "%p: 1:%p\n", s, $1}
"aaa": 1:""
"aab": 1:"b"
"abb": 1:"bb"
"bbb": 1:"bbb"
=> ["aaa", "aab", "abb", "bbb"]

2. negative lookbehind

irb(main):028:0> %w{aaa aab abb bbb}.each {|s| /.*(?<!b)(b*)\z/ =~ s;
printf "%p: 1:%p\n", s, $1}
"aaa": 1:""
"aab": 1:"b"
"abb": 1:"bb"
"bbb": 1:"bbb"
=> ["aaa", "aab", "abb", "bbb"]

Note though the special case where there is only one alternative with
a match anchored at the end:

irb(main):045:0> for b in body; for pre in segm; for post in segm;
s="#{pre}#{b}#{post}"; printf "%p -> %p\n",s,s[/#*\z/]; end end end
"" -> ""
"#" -> "#"
"##" -> "##"
"#" -> "#"
"##" -> "##"
"###" -> "###"
"##" -> "##"
"###" -> "###"
"####" -> "####"
"foo" -> ""
"foo#" -> "#"
"foo##" -> "##"
"#foo" -> ""
"#foo#" -> "#"
"#foo##" -> "##"
"##foo" -> ""
"##foo#" -> "#"
"##foo##" -> "##"
=> ["", "foo"]

Here, the simple expression works since the # are not eaten by other
portions of the regexp.

>  It arose when someone wanted to replace any number
> (or none) of a character at the start and end of a string with exactly
> one of that character.
>
> irb(main):001:0> 'foo'.gsub(/\A#*|#*\Z/, '#')
> => "#foo#"
> irb(main):002:0> '#foo'.gsub(/\A#*|#*\Z/, '#')
> => "#foo#"
> irb(main):003:0> '##foo'.gsub(/\A#*|#*\Z/, '#')
> => "#foo#"
> irb(main):004:0> 'foo#'.gsub(/\A#*|#*\Z/, '#')
> => "#foo##"
> irb(main):005:0> 'foo##'.gsub(/\A#*|#*\Z/, '#')
> => "#foo##"
> irb(main):006:0> '##foo##'.gsub(/\A#*|#*\Z/, '#')
> => "#foo##"

If one regexp should be used in this case the negative lookbehind is a
viable option since there is no preceding part in this alternative
which we can make non greedy:

irb(main):044:0> for b in body; for pre in segm; for post in segm;
s="#{pre}#{b}#{post}"; printf "%p -> %p\n",s,s.gsub(/\A#*|(?<!#)#*\z/,
'#'); end end end
"" -> "#"
"#" -> "#"
"##" -> "#"
"#" -> "#"
"##" -> "#"
"###" -> "#"
"##" -> "#"
"###" -> "#"
"####" -> "#"
"foo" -> "#foo#"
"foo#" -> "#foo#"
"foo##" -> "#foo#"
"#foo" -> "#foo#"
"#foo#" -> "#foo#"
"#foo##" -> "#foo#"
"##foo" -> "#foo#"
"##foo#" -> "#foo#"
"##foo##" -> "#foo#"
=> ["", "foo"]

> I blogged about it here:
> http://matthew.kerwin.net.au/blog/20110608_javascript_global_regexp

Turns out with Oniguruma there *is* a way to do it with a single
regexp.  In fact any regexp engine with lookbehind will do.

Reference: http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt

Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

In This Thread

Prev Next