From: Wilson Bilkovich Date: 2006-02-12T12:28:39+09:00 Subject: Re: Scanning a string for decimal numbers Well, that's what I get for dashing off a quick e-mail before dinner. The last problem Alexis mentioned is caused by the overly-specific lookahead at the end. Here's a version that fixes that: irb(main):013:0> a = '24.5 + 24 + 24. + 24.4.' => "24.5 + 24 + 24. + 24.4." irb(main):014:0> a.scan /[-+]?(\d+(?:\.\d+)?)(?=[^\d])/ => [["24.5"], ["24"], ["24"], ["24.4"]] irb(main):015:0> One of the characters '-' or '+', optionally Followed by at least one digit. Followed by an optional group containing a period, and one or more digits. The capturing group ends when the next character is something other than a digit. The (?:) mess is there so that '24.' doesn't end up with the period on the end. On 2/11/06, Jeppe Jakobsen wrote: > Seems I accidently got my text marked as a qoute in my last mail, so I'll > just send it a again: > > Let me see if I got it right then. I'll like to use periods only for my > decimal numbers. I also need normal integers so 24. being accepted won't > matter. Will this fix the problems you presented?: > /[-+]?(\d+\.?\d*)(?=\s|$)/ > > > I don't know if it takes care of the last problem, because I didn't > understand it. > > > 2006/2/12, Jeppe Jakobsen : > > > > 2006/2/12, Alexis Reigel : > > > > > > > > > > > This should handle periods or commas as the separator. > > > > > > > > a = "24,4 + 55,2 + 55 - 44,0" > > > > => "24,4 + 55,2 + 55 - 44,0" > > > > a.scan /(\d+,?.?\d*)(?=\s|$)/ > > > > => [["24,4"], ["55,2"], ["55"], ["44,0"]] > > > > > > > > > > Some problems here: > > > - signs are disregarded ("-24,4" becomes "24,4") > > > - Invalid numbers are accepted: eg. "24,.4" "24,." "24." "24," > > > - "." should be escaped. As you used it here, it means "any character" > > > (except newline), so many invalid numbers are accepted (e.g. "24w"...) > > > - If something different from whitespace follows the number, it is not > > > or false accepted, e.g. "24.4." becomes "4." instead of "24.4" > > > - ... > > > > > > > > > Alexis. > > > > > >