regex - Regular expression matching a numerical string exactly -
i have string looks 600/-4.412/11
, 1 looks 600/11
[optional sign][float or integer]/[optional sign][float or integer]/[optional sign][float or integer] [optional sign][float or integer]/[optional sign][float or integer]
example:
1) 600/-4.412/11 2) 600/11
and need find regular expression matches 1 , 1 matches 2. both expressions mustn't select/match other one. humble regex knowledge managed build expression:
([-+]?[0-9]+(\.?[0-9]+)?\/?){3}
the problem expression matches 1) 2) according http://gskinner.com/regexr/. can fix or @ least tell me why happening since hoped had change {3} {2} in order different matching.
problem
the problem regex allows repeated subpattern, i.e. [-+]?[0-9]+(\.?[0-9]+)?\/?
match without restricting each section of numbers delimited /
.
for example in question: 600/11
, first repetition match 600/
, second 1
, third 1 last 1
.
solution 1
wrong attempt
for validation, can change make works want:
^([-+]?[0-9]+(\.[0-9]+)?(?:/|$)){3}$
(?:/|$)
forces number (floating point or integer) end /
, or end of string. make sure each repetition not match within same number.
^
added in front , $
behind make sure string has 3 numbers.
the text not crossed out still applies in correct solution.
the correct solution
however, above regex wrong. still allow invalid input such 1/2/3/
match (ends /
). need add assertion @ end prevent case above matching:
^([-+]?[0-9]+(\.[0-9]+)?(?:/|$)){3}(?<!/)$
(?<!/)
zero-width negative look-behind checks character before end of string not /
.
solution 2
it less buggy write regex in form [number]([delimiter][number]){repeat}
in such cases, rather fiddling form ([number][delimiter/ending]){repeat}
.
the answer below strictly validates input:
^[-+]?[0-9]+(\.[0-9]+)?(?:/[-+]?[0-9]+(\.[0-9]+)?){2}$
the above matching case of 3 numbers. change 2
1
(or remove {2}
) match 2 numbers.