Максимальная длина без учета одного символа в регулярном выражении - PullRequest
1 голос
/ 24 октября 2019

У меня есть регулярное выражение, которое допускает до 6 десятичных знаков ("." - это десятичный разделитель)

/^\d*[.]?\d{0,6}$/

Я также хочу установить условие максимальной длины, чтобы пользователь мог ввести только 12 цифр и максимальную длинуследует исключить "."Как мне это сделать с Regex.

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Вы можете использовать положительный прогноз, чтобы проверить число с десятичным знаком (до 6 цифр после него или строку из 12 цифр), а затем всего до 13 символов:

^(?=\d*\.\d{0,6}$|\d{1,12}$).{1,13}$

Для этого входа 2-е и 5-е значения будут совпадать:

1234567890123
123456.789012
12345.6789012
1234567.890123
12345.67890

Демонстрация на regex101

1 голос
/ 24 октября 2019

Мы могли бы попробовать использовать отрицательные взгляды:

^(?:(?!.*\.)(?!\d{13})|(?=.*\.)(?![0-9.]{14}))\d+(?:\.\d{1,6})?$

Демо

Вот объяснение регулярного выражения:

^(?:                        from the start of the string
    (?!.*\.)(?!\d{13})      assert that no more than 12 digits appear
                            (in the case of a number with NO decimal point)
    |                       or
    (?=.*\.)(?![0-9.]{14})) assert that no more than 13 digits/decimal point appears
                            (in the case of a number which HAS a decimal point)
    \d+                     then match one or more digits (whole number portion)
    (?:\.\d{1,6})?          followed by an optional decimal component (1 to 6 digits)
$                           end of the string
0 голосов
/ 24 октября 2019

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

...