Минимальная длина регулярного выражения в сложном совпадении - PullRequest
2 голосов
/ 06 ноября 2019

У меня есть следующее регулярное выражение:

^(?P<wrap_0>\()?[-+]?((?P<whole_part>\d+\.?)|(?P<decimal_part>\d*\.\d+))(?(wrap_0)\))$

Есть ли способ утверждать, что whole_part + decimal_part имеет длину не менее 8 символов? Другими словами, это должно соответствовать:

1029.20384 # yes
102 # no, length of 3 < 8

Существующее здесь регулярное выражение: https://regex101.com/r/rTrCeB/1 (PCRE / php flavor).

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Вы можете использовать положительный прогноз, чтобы утверждать по крайней мере 8 раз цифру или точку справа, а затем сопоставлять цифры 1+ с необязательной десятичной частью.

^(?=[\d.]{8,}$)\d+(?:\.\d+)?$

По частям

  • ^ Начало строки
  • (?=[\d.]{8,}$) Положительный прогноз, утверждение 8 или более раз, либо точка, либо цифра
  • \d+ Соответствие
  • (?:\.\d+)? При желании сопоставить точку и 1+ цифры
  • $ Конец строки

Regex demo

2 голосов
/ 06 ноября 2019

Вы можете использовать чередование здесь:

^(\d{8,}|(?=[0-9.]{8,})\d+(?:\.\d+))$

Демо

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

^                     from the start of the string
(
    \d{8,}            match a pure number (no decimal component) of 8 or more digits
    |                 OR
    (?=[0-9.]{8,})    assert that 8 or more digits or decimal point occurs
    \d+(?:\.\d+)      then match a number followed by a decimal component
)
$                     end of the string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...