我需要能够在一组数字中搜索与运行时输入的表达式匹配的值。我想知道是否有类似于正则表达的东西,但具体是数字吗?
澄清一下,我的问题是“我想知道是否有类似于正则表达的内容,但具体是针对数字?”
@FreeNickname似乎有正确的想法,可以在运行时评估算术/逻辑表达式。
一些简单的例子。
我有一个整数数组:
100,145,675,0,250,43,19
我想找到100-300之间的任何一个 那将是100,145和250。
我想找到0,50或100的任何东西 那将是100和0。
我想找到任何50的倍数。
那将是0,100和250(或者可能只有100和250,它只是一个例子)
答案 0 :(得分:1)
为什么你需要regex-y?代码听起来很简单 -
while(true){
cout << "enter the min: ";
cin >> min;
cout << "enter the max: ";
cin >> max;
for(int i=0;i<ARR_SIZE;i++){
if(arr[i]>mind && arr[i]<max) cout << arr[i];
}
}
答案 1 :(得分:1)
正则表达式可用于查找文本中具有特殊属性的数字,但这可能不是最佳解决方案。
([12]\d\d)|(300)
0|(50)|(100)
\d*[05]0
这些可以(并且应该)通过应用lookaround结构进行优化(例如,50
不仅会匹配50
,还会匹配250
,但(?<=^| )50(?=$|,)
1}}不会),但我认为上面的例子证明了这一点。如果您可以将字符串转换为数字数组,那么将数字视为数字会更快,就像@ Dgrin91建议的那样。
无论如何,“数字分析器正则表达式”的经典示例是用于验证IP地址的示例:
\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
这里有四个用点分隔的整数,每个整数必须在0到255之间。
答案 2 :(得分:1)
没有任何类似于正则表达的东西,但是对于数字没有特别的。正如其他回复所指出的那样,您需要自己设计一些东西。
答案 3 :(得分:0)
“我需要能够在一组数字中搜索与运行时输入的表达式匹配的值”
你真正需要的是:std::vector<int>
如果vector是一个选项(允许)遍历您的数组,评估特定条件(范围,特定值等)
您可以明确处理特定情况(检查特定字符串),这是一种可能的方法:
int a[] = {100, 145, 675, 0, 250, 43, 19};
size_t len = sizeof(a) / sizeof(a[0]);
std::string expr;
std::cin >> expr;
if (expr == "%50") {
for (size_t i = 0; i < len; ++i) {
if (a[i] % 50 == 0)
...
}
}
答案 4 :(得分:0)
C ++ 11有一些不错的东西:
int min = 100;
int max = 300;
std::vector<int> numbers = {100, 145, 675, 0, 250, 43, 19};
std::vector<int> result(numbers.size());
auto it = std::copy_if(numbers.begin(), numbers.end(), result.begin(),
[&](int i){return i >= min && i <= max;} );
result.resize(std::distance(result.begin(), it));
使用最后的lambda函数选择要删除的元素,对于50的倍数return a % 50 == 0;
。
答案 5 :(得分:0)
std::vector<int> myvector {100, 145, 675, 0, 250, 43, 19};
std::size_t min =100, max=300;
std::cout<<"In Range "<<"[ "<<min<<", "<<max<<" ]"<<std::endl;
std::copy_if(myvector.begin(), myvector.end(),
std::ostream_iterator<int>(std::cout," "),
[=](const int& x)
{
return (x>=min) && (x<=max );
}
);
std::cout<<"\nAre [0,50,100]"<<std::endl;
std::size_t a=0,b=50,c=100;
std::copy_if(myvector.begin(), myvector.end(),
std::ostream_iterator<int>(std::cout," "),
[=](const int& x)
{
return (x==a) || (x == b ) || (x==c);
}
);
std::size_t num=50;
std::cout<<"\nAre multiple of"<<num<<std::endl;
std::copy_if(myvector.begin(), myvector.end(),
std::ostream_iterator<int>(std::cout," "),
[=](const int& x)
{
return (x%num==0);
}
);