Регулярное выражение на 1-50 без десятичной точки

StackOverflow https://stackoverflow.com/questions/4343004

  •  30-09-2019
  •  | 
  •  

Вопрос

Я ищу регулярное выражение, которое будет соответствовать любому количеству от 1 до 50 включено. До сих пор я нашел примеры, но все они позволяют строки содержать десятичную точку, которую я не хочу включать. Так что 1,13,24,50 в порядке, но 1. И т. Д. нет. Есть ли регентэксп, что я могу использовать?

Спасибо заранее, Тим

Это было полезно?

Решение

Попробуй это:

/^(?:[1-9]|[1-4][0-9]|50)$/

ОБНОВИТЬ:

Теперь, когда я вижу, что вопрос был обновлен для ссылки на MySQL, это значительно меняет вещи. Вышеупомянутое регулярное выражение использует не захватывающие пары, которые не поддерживаются MySQL. Но это также просит вопрос; Если вы действительно используете регулярные выражения для решения этой проблемы? Нам действительно нужно посмотреть, как вы храните свои номера, которые должны быть от 1 до 50 лет. varcharS? Они intS? Я продемонстрирую, как решить это оба пути. Сначала я настрою тестовую таблицу с индексами:

create table regextest (
    id int unsigned primary key auto_increment,
    varchar_number varchar(5) not null,
    int_number int not null,
    index(varchar_number),
    index(int_number)
) engine=innodb;

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

insert into regextest (varchar_number, int_number)
    values ('0', 0), ('1', 1), ('35', 35), ('49', 49), ('50', 50), ('51', 51);

И теперь, вот запрос, который решит вашу проблему, предполагая, что ваши номера хранятся как строки в varchar_number столбец:

mysql> select * from regextest where varchar_number rlike '^([1-9]|[1-4][0-9]|50)$';
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
|  2 | 1              |          1 |
|  3 | 35             |         35 |
|  4 | 49             |         49 |
|  5 | 50             |         50 |
+----+----------------+------------+
4 rows in set (0.00 sec)

Это работает, но он плохо будет работать на больших наборах данных, потому что он не может использовать индекс, даже если он присутствует. MySQL должен запускать регулярное выражение один раз для каждой строки в таблице. Предположим, ваши цифры от 1 до 50 были сохранены как intS в int_number столбец. Вы могли бы просто сделать это:

mysql> select * from regextest where int_number between 1 and 50;
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
|  2 | 1              |          1 |
|  3 | 35             |         35 |
|  4 | 49             |         49 |
|  5 | 50             |         50 |
+----+----------------+------------+
4 rows in set (0.00 sec)

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

Другие советы

'^(0?\d|[1-4]\d|50)$'

То есть:

  • Начало ввода
  • с последующим одной цифрой (необязательно предшествует 0) или
  • с последующим 1-4, а затем какая-либо цифра, или
  • затем 50.
  • а затем убедитесь, что мы видим конец ввода.

Редактировать: Вышеуказанное позволяет 0 (и 00), которое вы наверняка не хотите. Итак, предположить, что вы на самом деле не хотели, чтобы ведущие нули разрешены в любом случае:

'^([1-9]|[1-4]\d|50)$'

Редактировать: По мере более поздних комментариев OP указывают, что это для MySQL, я изменил синтаксис для указания шаблона.

^([1-9]|[1-4][0-9]|50)$

Попробуй это

([0-4]{1}[0-9]{0,1}[.]{0,1}[0-9]{0,2}|50)

сделает следующее

45.00 - Match
4     - Match
78    - Not Match
51    - Not Match
21.25 - Match

«Обман» с Perl6 :: Правила:

/ ( \d+ ) { 1 <= $1 && $1 <= 50 or fail } /

Или в Perl 5.10 и выше,

/(\d+)(?(?{1>$1||50<$1})(*FAIL))/
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top