1

如何使用正则表达式执行范围检查?

以一个4比特数(即"dddd")为例,我如何检查它是否在给定范围内,比如说[1256-4350]与否?

4

4 回答 4

4

要检查输入是否为 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 在评论中提到的那样,由于您已经验证了输入是一个 4 位数字,因此没有必要将其转换为整数。假设inputstd::string,这也可以

if(input >= "1256" && input <= "4350") {
    // input is within range
}
于 2014-02-13T13:49:18.817 回答
3

使用这个网站,你所追求的正则表达式应该是这样的:^(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)$.

话虽如此,我认为它更具可读性和可维护性,将其分为两个步骤,首先验证数据类型,然后验证范围。(当范围发生变化时会发生什么?您的整个正则表达式很可能会变得无用)。

于 2014-02-13T13:45:36.323 回答
2

是一个很棒的网站,可以为您提供答案。

对于您的示例:

(\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

于 2014-02-13T13:45:31.753 回答
1

是的,我知道这会奏效。我只想检查我们是否可以验证它确实是一个数字,同时检查它的范围使用

好的...但是不要在这个任务中使用正则表达式。这是一个可怕的选择。

#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;
}

现场观看

于 2014-02-13T14:00:33.920 回答