^([1-9]|[1-9][0-9]|[1][0-9][0-9]|20[0-0])$
[1] simplifies to 1 - you only need a character group if there's more than one character.
[0-0] might crash the RegEx parser. This simplifies to '0'.
[0-9] can usually be expressed as \d if your RegEx is allowed in PCRE format, and this aids readability, a [x-y] group being used only when it is not the full 0 to 9 range. If you can only use POSIX, you'll have to stick to [0-9] notation.
Try:
^([1-9]|[1-9]\d|1\d\d|200)$
However, the part [1-9]|[1-9]\d is "1 to 9 OR 1 to 9 plus a digit"
"10 to 99" is just "1 to 9 plus another digit".
The expression can be compressed, i.e. "1 to 9 plus optional digit": [1-9]\d?
So, 1 to 200 is:
( 1 to 9 and 10 to 99 | 100 to 199 | 200 )
Often the problem that needs to be solved can be defined in a different way leading to a much simpler pattern.
Oh, and 1 to 100 is:
( 1 to 9 and 10 to 99 | 100 )