Проверка диапазона с помощью регулярных выражений?

Как выполнить проверку диапазона с помощью регулярных выражений?

Возьмите 4-битное число (т.е. "dddd"Например, как я могу проверить, находится ли он в заданном диапазоне, скажем, [1256-4350] или нет?

4 ответа

Решение

Чтобы проверить, является ли ввод четырехзначным числом, используйте regex_match, а затем преобразовать строку в целое число, используя std::stoi проверить диапазон.

std::regex expr(R"(\d{4})");

if(std::regex_match(input, expr)) {
    int num = std::stoi(input);

    if(num >= 1256 && num <= 4350) {
        // input is within range
    }
}   

Как упоминает Jarod42 в комментариях, поскольку вы уже подтвердили, что ввод представляет собой четырехзначное число, нет необходимости преобразовывать его в целое число. Если предположить, input является std::string это тоже подойдет

if(input >= "1256" && input <= "4350") {
    // input is within range
}

Используя этот сайт, регулярное выражение, которое вы ищете, должно выглядеть следующим образом: ^(125[6-9]|12[6-9][0-9]|1[3-9][0-9]{2}|[23][0-9]{3}|4[0-2][0-9]{2}|43[0-4][0-9]|4350)$,

При этом, я думаю, что это гораздо более читабельно и легко обслуживаемо, разбейте его на два этапа: сначала проверьте тип данных, а затем диапазон. (Что происходит, когда диапазон меняется? Все ваши регулярные выражения, скорее всего, станут бесполезными).

Вот отличный сайт, который даст вам ответ.

Для вашего примера:

(\b(125[6-9]|12[6-9][0-9]|1[3-9][0-9]{2}|[23][0-9]{3}|4[0-2][0-9]{2}|43[0-4][0-9]|4350)\b

Да, я знаю, что это сработает. Я просто хочу проверить, можем ли мы проверить, действительно ли это число, и в то же время проверить его диапазон, используя

Хорошо... Но не используйте регулярные выражения для этой задачи. Это ужасный выбор.

#include <iostream>
#include <sstream>
using namespace std;


bool is_number_in_range(string s) {
    istringstream str(s);
    int i; char c;
    str >> i;
    if( str.fail() ) return false;
    return i>=1256 && i<=4350 && str.eof();
}

int main() {
    cout<< is_number_in_range("0") << '\n'<<
        is_number_in_range("1234") << '\n'<<
        is_number_in_range("1256") << '\n'<<
        is_number_in_range("2000") << '\n'<<
        is_number_in_range("4350") << '\n'<<
        is_number_in_range("5000") << '\n'<<
        is_number_in_range("abcd") << '\n'<<
        is_number_in_range("1234.0") << '\n';


    return 0;
}

увидеть это в прямом эфире

Другие вопросы по тегам