TL; DR;
^(?!(?:\D*\d){13})\d*[.]?\d{0,6}$
^(?=(?:\D*\d){0,12}\D*$)\d*[.]?\d{0,6}$
Вы можете использовать простой подход с положительным прогнозом: сохраняйте свой паттерн (если он работает, как вы ожидаете) и вставьте
(?=(?:\D*\d){0,x}\D*$)
сразу после ^
и измените x
на необходимое количество цифр.
Таким образом, вы можете использовать
^(?=(?:\D*\d){0,12}\D*$)\d*[.]?\d{0,6}$
^^^^^^^^^^^^^^^^^^^^^^^
(?=(?:\D*\d){0,12}\D*$)
соответствует местоположению, которое являетсясразу за ним следуют от 0 до 12 вхождений любых 0+ нецифровых символов, за которыми следует одна цифра один, а затем с 0+ нецифровыми числами до конца строки.
См. regex demo
В качестве альтернативы можно запретить строку, состоящую из более чем 13 цифр:
^(?!(?:\D*\d){13})\d*[.]?\d{0,6}$
^^^^^^^^^^^^^^^^^
(?!(?:\D*\d){13})
- это отрицательный прогноз, который не дает совпадения, если существует 13вхождения любых 0+ не-цифр с последующими однозначными символами.
Это лучше, чем подход с положительным прогнозом, когда вам нужно разрешить пустую строку.
См. regex demo