Regular expresson isue

I have following regular expression to parse time.

([0-9]|0[0-9]|1[012]):([0-9]|0[0-9]|[1-5][0-9])\s*(am|pm)

I don't want this regext to match 13:45 PM because the the numerical
value before the colon should be limited to 12. How to fix it?

You can play with this regex at

http://www.rubular.com/regexes/863

···

--
Posted via http://www.ruby-forum.com/.

Raj Singh wrote:

I have following regular expression to parse time.

([0-9]|0[0-9]|1[012]):([0-9]|0[0-9]|[1-5][0-9])\s*(am|pm)

You want to match from the beginning of the string. So put a ^ before
your statement -

^([0-9]|0[0-9]|1[012]):([0-9]|0[0-9]|[1-5][0-9])\s*(am|pm)

···

--
Posted via http://www.ruby-forum.com/\.

# ([0-9]|0[0-9]|1[012]):([0-9]|0[0-9]|[1-5][0-9])\s*(am|pm)
# I don't want this regext to match 13:45 PM because the the numerical
# value before the colon should be limited to 12. How to fix it?

Hi Raj,

the 13 is matching

  ([0-9]|0[0-9]|1[012])
   ^^^^^
   this

because the regex will match the 3. the regex did not care if it had a 1 before it.

You may want to tell it to not match any preceding digit (or else it be a beginning of the string) if you want a stand alone digit.
eg, you may want to achor/prefix it w the ^ (for beginning of string)
or \D (to represent a non-digit character)

sample tests,

irb(main):112:0> re = /((^|\D)[0-9]|0[0-9]|1[012]):confused:
=> /((^|\D)[0-9]|0[0-9]|1[012]):confused:

irb(main):113:0> re =~ "1:"
=> 0
irb(main):114:0> re =~ " 1:"
=> 0
irb(main):117:0> re =~ "13:"
=> nil

irb(main):122:0> re =~ "01:"
=> 0
irb(main):123:0> re =~ "11:"
=> 0
irb(main):124:0> re =~ "12:"
=> 0

kind regards -botp

···

From: Raj Singh [mailto:neeraj.jsr@gmail.com]

I have following regular expression to parse time.

([0-9]|0[0-9]|1[012]):([0-9]|0[0-9]|[1-5][0-9])\s*(am|pm)

This seems overly complex, especially your minute matching. This can
be simplified at least to "\d?\d" or "\d{1,2}".

I don't want this regext to match 13:45 PM because the the numerical
value before the colon should be limited to 12. How to fix it?

Do you need this for direct matching of a string or scanning of larger
volumes of text? Here's an alternative (untested):

%r{
  \b
  (0?\d|1[012]) # hour
  :
  ([0-5]\d) # minute
  \s*
  (am|pm)
}xi

If you want to use this for matching you probably rather want

%r{
  \A
  (0?\d|1[012]) # hour
  :
  ([0-5]\d) # minute
  \s*
  (am|pm)
  \z
}xi

Note, the comments can stay in there when copy and pasting.

Kind regards

robert

···

2008/8/13 Raj Singh <neeraj.jsr@gmail.com>:

--
use.inject do |as, often| as.you_can - without end

Sorry to be the awkward one, but maybe you should consider handling
this programatically, rather than in a regex?

Pros: your code is likely to be easier to understand: that makes it
more maintainable.
Cons: your code will be longer.

···

On Wed, Aug 13, 2008 at 3:40 AM, Peña, Botp <botp@delmonte-phil.com> wrote:

From: Raj Singh [mailto:neeraj.jsr@gmail.com]
# ([0-9]|0[0-9]|1[012]):([0-9]|0[0-9]|[1-5][0-9])\s*(am|pm)
# I don't want this regext to match 13:45 PM because the the numerical
# value before the colon should be limited to 12. How to fix it?

Hi Raj,

the 13 is matching

([0-9]|0[0-9]|1[012])
  ^^^^^
  this

because the regex will match the 3. the regex did not care if it had a 1 before it.

You may want to tell it to not match any preceding digit (or else it be a beginning of the string) if you want a stand alone digit.
eg, you may want to achor/prefix it w the ^ (for beginning of string)
or \D (to represent a non-digit character)

sample tests,

irb(main):112:0> re = /((^|\D)[0-9]|0[0-9]|1[012]):confused:
=> /((^|\D)[0-9]|0[0-9]|1[012]):confused:

irb(main):113:0> re =~ "1:"
=> 0
irb(main):114:0> re =~ " 1:"
=> 0
irb(main):117:0> re =~ "13:"
=> nil

irb(main):122:0> re =~ "01:"
=> 0
irb(main):123:0> re =~ "11:"
=> 0
irb(main):124:0> re =~ "12:"
=> 0

kind regards -botp

--
All you can do is try to know who your friends are as you head off to
the war / Pick a star on the dark horizon and follow the light