Регулярное выражение: для сопоставления целочисленных значений без знака (допустимые значения: только от 0 до 65535) для значений, разделенных запятыми - PullRequest
0 голосов
/ 11 марта 2020

У меня есть

([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5])

, который работает для одного ввода как:

0
1
65
6553

, но я хочу, чтобы они вводились через запятую как:

0,1,65,6553 -> это допустимая строка 65535,-1,25 -> это недопустимая строка из-за отрицательного числа.

пожалуйста, кто-нибудь может предложить решение

Примечание:

I have already tried repetition as:
^([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5])+(,(([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5])))*$

который также принимает 65537, что нежелательно.

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Вы можете использовать

^(?:\d{1,4}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])(?:,(?:\d{1,4}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))*$

В PCRE и Onigmo вы можете использовать более короткий шаблон, где \g<1> повторный шаблон группы 1:

^(\d{1,4}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])(?:,\g<1>)*$

См. Регулярное выражение demo и regex demo # 2

Регулярное выражение в основном ^<BLOCK>(?:,<BLOCK>)*$, где шаблон BLOCK - это регулярное выражение, соответствующее числам от 0 до 65535:

  • \d{1,4} - 1, 2, 3 или 4 цифры (0 - 9999)
  • [1-5]\d{4} - 1 до 5 ди git, а затем любые 4 цифры (10000 - 50000)
  • 6[0-4]\d{3} - 6, затем ди git от 0 до 4, а затем три цифры (60000 - 64999)
  • 65[0-4]\d{2} - 65, ди git от 0 до 4, а затем любые две цифры (65000 - 65499 )
  • 655[0-2]\d - 655, ди git от 0 до 2, а затем любой ди git (65500 - 655299)
  • 6553[0-5] - 6553, а затем ди git от 0 до 5 (65530 - 65535)

Общая схема:

  • ^ - начало строки
  • <BLOCK> - Шаблон BLOCK, описанный выше
  • (?:,<BLOCK>)* - 0 или более повторений ,, а затем шаблон BLOCK
  • $ - конец строки.
0 голосов
/ 11 марта 2020

Проверка границ чисел впоследствии кажется мне более простой, но в любом случае вы можете использовать это регулярное выражение (я немного изменил целочисленную часть)

^(([0-5]?\d{0,4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])(,|(?=$)))+$

https://regex101.com/r/1RpNuy/1

Подробности:

  • ^: начало строки
  • (: начало группы
    • ([0-5]?\d{0,4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]): Соответствует номеру
    • (,|(?=$)): соответствует , или убедитесь, что это конец строки (но без чтения $)
  • )+: конец группы, повторять столько раз, сколько возможно
  • $: конец строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...