Подтвердить что ты не робот

Соответствует определенной длине x или y

Я бы хотел, чтобы регулярное выражение было либо X, либо Y символом. Например, сопоставьте строку длиной 8 или 11 символов. В настоящее время я реализовал это так: ^([0-9]{8}|[0-9]{11})$.

Я мог бы также реализовать его как: ^[0-9]{8}([0-9]{3})?$

Мой вопрос: Могу ли я иметь это регулярное выражение без дублирования части [0-9] (что более сложно, чем этот простой пример \d)?

4b9b3361

Ответ 1

Есть один способ:

^(?=[0-9]*$)(?:.{8}|.{11})$

или, альтернативно, если вы хотите сначала выполнить проверку длины,

^(?=(?:.{8}|.{11})$)[0-9]*$

Таким образом, у вас есть сложная часть только один раз и общий . для проверки длины.

Объяснение:

^       # Start of string
(?=     # Assert that the following regex can be matched here:
 [0-9]* # any number of digits (and nothing but digits)
 $      # until end of string
)       # (End of lookahead)
(?:     # Match either
 .{8}   # 8 characters
|       # or
 .{11}  # 11 characters
)       # (End of alternation)
$       # End of string

Ответ 2

С Perl вы можете сделать:

my $re = qr/here_is_your_regex_part/;
my $full_regex = qr/$re{8}(?:$re{3})?$/