数字匹配表达式

时间:2013-10-24 20:04:55

标签: c++ regex arrays math

我需要能够在一组数字中搜索与运行时输入的表达式匹配的值。我想知道是否有类似于正则表达的东西,但具体是数字吗?

澄清一下,我的问题是“我想知道是否有类似于正则表达的内容,但具体是针对数字?”

@FreeNickname似乎有正确的想法,可以在运行时评估算术/逻辑表达式。

一些简单的例子。

我有一个整数数组:
100,145,675,0,250,43,19

我想找到100-300之间的任何一个 那将是100,145和250。

我想找到0,50或100的任何东西 那将是100和0。

我想找到任何50的倍数。
那将是0,100和250(或者可能只有100和250,它只是一个例子)

6 个答案:

答案 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)

正则表达式可用于查找文本中具有特殊属性的数字,但这可能不是最佳解决方案。

  • 在100-300之间:([12]\d\d)|(300)
  • 0,50或100:0|(50)|(100)
  • 50的倍数:\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);
         }
         ); 

请参阅Was this so difficulty ?