РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ для приема чисел, разделенных запятыми, но диапазон чисел равен 0-32767

#regex #numbers #expression #range #spaces

#регулярное выражение #числа #выражение #диапазон #пробелы

Вопрос:

Мне нужно написать регулярное выражение для приема ввода, подобного этому

 23,456,22,1,32767
  

т. е.

  1. Запятые не допускаются ни в начале, ни в конце.
  2. Пробелы могут стоять перед запятой и / или начинаться с нее, например, для 23, 45,56, 67 и т.д.
  3. Диапазоны каждого числа должны быть 0-32767.

В настоящее время я использую регулярное выражение, подобное этому [0-9] (,[0-9] )* .

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

Комментарии:

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

2. codinghorror.com/blog/2008/06/…

Ответ №1:

Вероятно, разумно сделать это в два этапа. Сначала проверьте, что диапазон равен 0-99999:

 ^[0-9]{1,5}( *, *[0-9]{1,5})*$
  

Затем преобразуйте строку в список целых чисел, используя язык программирования общего назначения, и проверьте это x <= 32767 для каждого целого числа x.

Комментарии:

1. 1, но вы можете захотеть добавить s* вокруг запятой, чтобы разрешить пробелы, как просил Басма.

2. » s *» или «*»? Вопрос кажется очень неясным в этом пункте.

3. Спасибо, Марк! Это помогло!

4. Марк, не мог бы ты, пожалуйста, подсказать мне регулярное выражение для того, чтобы написать регулярное выражение для приема входных данных, подобных этому 23,456,22,1,32767, т.е. 1.No запятые разрешены в начале или в конце. 2. Пробелы могут стоять перед запятой и / или начинаться с нее, например, для 23, 45,56, 67 и т.д. далее

5. что я должен изменить в этом, чтобы просто принимать числа, разделенные запятыми, без пробелов между ними?

Ответ №2:

Вы можете проверить диапазон чисел с помощью регулярного выражения, но поскольку вам нужно посмотреть на текстовое представление чисел, регулярное выражение будет трудно прочитать:

 0*(?:3276[0-7]|327[0-5][0-9]|32[0-6][0-9]{2}|3[01][0-9]{3}|[12][0-9]{4}|[1-9][0-9]{1,3}|[0-9])
  

соответствует целому числу от 0 до 32767 с необязательными начальными нулями.

Таким образом, все ваше регулярное выражение будет

 ^0*(?:3276[0-7]|327[0-5][0-9]|32[0-6][0-9]{2}|3[01][0-9]{3}|[12][0-9]{4}|[1-9][0-9]{1,3}|[0-9])(?: *, *0*(?:3276[0-7]|327[0-5][0-9]|32[0-6][0-9]{2}|3[01][0-9]{3}|[12][0-9]{4}|[1-9][0-9]{1,3}|[0-9]))*$
  

Теперь представьте, что вы унаследовали это регулярное выражение от коллеги, который покинул вашу компанию много лет назад…Получайте удовольствие 🙂

Поэтому воспользуйтесь советом Марка.

Этот ответ предназначен исключительно для образовательных целей и не является рекомендацией использовать регулярное выражение в данном случае.