Сначала вы должны обернуть все выражение, кроме границ строк в группе. В противном случае ваше выражение просто скажет, что либо начинается с ..., либо заканчивается на ... , поскольку |
имеет более высокий приоритет, чем ^
и $
:
^(100|(\d\d?)(\.(1[01]?|0\d?))?)$
А теперь решение вашего вопроса:
^((100|[1-9]?[0-9])(\.\d{1,2})?|\.\d{1,2})$