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]+$/