如何使用正则表达式执行范围检查?
以4
- 位数(即"dddd"
)为例,如何检查它是否在给定范围内,比如说[1256-4350]
?
答案 0 :(得分: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位数字,所以没有必要将它转换为整数。假设input
是std::string
,这也可以使用
if(input >= "1256" && input <= "4350") {
// input is within range
}
答案 1 :(得分:3)
使用this网站,您所使用的正则表达式应如下所示:^(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)$
。
话虽如此,我认为将其分解为两个步骤更具可读性和可维护性,首先验证数据类型然后验证范围。 (当范围发生变化时会发生什么?你的整个正则表达式很可能会变得毫无用处。)
答案 2 :(得分:2)
Here是一个很棒的网站,可以为您提供答案。
对于你的例子:
(\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
答案 3 :(得分: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;
}