Вы можете сначала проверить общую длину с помощью lookahead , а затем проверить длину чисел после десятичной точки.
Если вы хотите X общее число цифр и самое большее Y десятичных знаков, вы можете использовать:
^(?=.{X+1}$)([1-9]\d*|0)\.\d{1,Y}$
Объяснение:
^ asserts you are in the start position of the line
(?= lookahead (zero length) match for:
.{X + 1} X+1 characters
$ end of line //now you have asserted the total length
the whole part either
0 is a single zero
[1-9]\d* more than a single digit and does not start with zero
\. a dot for the decimal point
\d{1,Y} at least 1 and at most Y digits
$ asserts end of line
Обратите внимание, что вам не нужно проверять длину вся часть, поскольку вы уже проверяете общую длину и длину цифр после десятичной точки, поэтому часть до десятичной точки автоматически корректируется.
Пример:
Для X = 5
и Y = 2
, у вас будет:
^(?=.{8}$)([1-9]\d*|0)\.\d{1,2}$
Regex101 demo