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
Raj S. 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)
From: Raj S. [mailto:[email protected]]
([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])
=> /((^|\D)[0-9]|0[0-9]|1[012])
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
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.
2008/8/13 Raj S. [email protected]:
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