0

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

为了澄清,我的问题是“我想知道是否有任何类似于正则表达式但专门针对数字的东西?”

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

一些简单的例子。

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

我想找到100-300之间的任何东西。
那将是 100、145 和 250。

我想找到任何 0、50 或 100。
那将是 100 和 0。

I want to find any that are a multiple of 50.
That would be 0, 100 and 250 (or maybe just 100 and 250, its just an example)

4

6 回答 6

1

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

  • 100-300 之间:([12]\d\d)|(300)
  • 0、50 或 100:0|(50)|(100)
  • 50 的倍数:\d*[05]0

这些可以(并且应该)通过应用环视结构来改进(例如,50不仅匹配,50而且匹配250,但不会匹配(?<=^| )50(?=$|,)),但我认为上面的例子说明了这一点。如果您可以将字符串转换为数字数组,那么将数字视为数字会更快,正如@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 之间。

于 2013-10-24T20:11:50.427 回答
1

为什么你需要一些正则表达式?代码听起来很简单——

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];
    }
}
于 2013-10-24T20:07:38.430 回答
1

不,没有任何类似于正则表达式的东西,而是专门针对数字。正如其他回复所指出的,您需要自己设计一些东西。

于 2013-10-24T21:24:10.347 回答
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);
         }
         ); 

看看这有那么难吗?

于 2013-10-24T20:50:42.090 回答
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;.

于 2013-10-24T20:16:03.803 回答
0

“我需要能够在一组数字中搜索与运行时输入的表达式匹配的值”

你真正需要的是:
  • 将输入读入数字数组,理想情况下,std::vector<int>如果向量是一个选项(允许)
  • 使用自定义的明确规则解析“在运行时输入的表达式”和
  • 遍历您的数组,评估特定条件(范围、特定值等)

    您可以显式处理特定情况(检查特定字符串),这是一种可能的方法:

    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)
                ...
        }
    }
    
于 2013-10-24T20:14:02.653 回答