The fully general method, given regexes /^A$/
and /^B$/
is:
/^(A|B|AB)$/
i.e.
/^([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/
Note the others have used the structure of your example to make a simplification. Specifically, they (implicitly) factorised it, to pull out the common [0-9]*
and [0-9]+
factors on the left and right.
The working for this is:
- all the elements of the alternation end in
[0-9]+
, so pull that out:/^(|\.|[0-9]+\.)[0-9]+$/
- Now we have the possibility of the empty string in the alternation, so rewrite it using
?
(i.e. use the equivalence(|a|b) = (a|b)?
):/^(\.|[0-9]+\.)?[0-9]+$/
- Again, an alternation with a common suffix (
\.
this time):/^((|[0-9]+)\.)?[0-9]+$/
- the pattern
(|a+)
is the same asa*
, so, finally:/^([0-9]*\.)?[0-9]+$/