2010-06-22 171 views
4

我想测试std::string为包含任何范围的数字,例如5 to 35std::string s = "XDGHYH20YFYFFY"会有功能,或者我将不得不将数字转换为字符串,然后使用循环找到每一个?检查字符串是否包含一个数字范围

+3

我想你在这里需要的是一个正则表达式。 – 2010-06-22 18:35:11

+0

您是否试图在范围内找到至少一个数字或范围内的所有数字?如果这是第一个我认为使用正则表达式会更好,但如果你将检查范围内的所有数字比使用查找功能。 – 2010-06-22 18:44:33

回答

9

我可能会使用该处理一切,除了数字为白色空间的区域,并从与该区域充满一个字符串流读取的数量和检查,如果他们在范围:

#include <iostream> 
#include <algorithm> 
#include <locale> 
#include <vector> 
#include <sstream> 

struct digits_only: std::ctype<char> 
{ 
    digits_only(): std::ctype<char>(get_table()) {} 

    static std::ctype_base::mask const* get_table() 
    { 
     static std::vector<std::ctype_base::mask> 
      rc(std::ctype<char>::table_size,std::ctype_base::space); 

     std::fill(&rc['0'], &rc['9'], std::ctype_base::digit); 
     return &rc[0]; 
    } 
}; 

bool in_range(int lower, int upper, std::string const &input) { 
    std::istringstream buffer(input); 
    buffer.imbue(std::locale(std::locale(), new digits_only())); 

    int n; 

    while (buffer>>n) 
     if (n < lower || upper < n) 
      return false; 
    return true; 
} 

int main() { 
    std::cout << std::boolalpha << in_range(5, 35, "XDGHYH20YFYFFY"); 
    return 0; 
} 
2

尽管有些人会立即转到正则表达式,但我认为您最好的选择是混合解决方案。使用REGEX查找数字,然后解析它们并查看它们是否在范围内。

在C#中是这样的。不确定在C++中可以使用哪些正则表达式库。

using System.Text.RegularExpressions.Regex; 
using System.Text.RegularExpressions.Match; 
using System.Text.RegularExpressions.MatchCollection; 

private static const Regex NUMBER_REGEX = new Regex(@"\d+") 

public static bool ContainsNumberInRange(string str, int min, int max) 
{ 
    MatchCollection matches = NUMBER_REGEX.Matches(str); 
    foreach(Match match in matches) 
    { 
     int value = Convert.ToInt32(match.Value); 
     if (value >= min && value <= max) 
      return true; 
    } 

    return false; 
} 
+0

你可以在C++中使用boost :: regex。我不确定'\ d +'表达式;你可以更精确。例如,用\ d {1,2}'可以更有效地找到范围3-35(假设X200Y匹配) – MSalters 2010-06-23 09:19:19

+0

我认为X200Y不应该匹配,因为它应该解析为200,这不在范围内。不过,这个问题还没有被很好地解释清楚。 – jdmichal 2010-06-23 18:07:03

0

如果您正在搜索范围内的所有数字,请在循环中使用string :: find函数。下面是该函数的引用:

http://www.cplusplus.com/reference/string/string/find/

而且你想在字符串中使用的数字只有一次?例如SDFSD256fdsfs会给你数字2 5 6 25 56 256,如果你没有在每次比赛结束后将它们从字符串中删除。

0

您可以用stringstream对象迭代执行此操作。

#include <iostream> 
#include <string> 
#include <sstream> 
#include <cctype> 

void check (std::string& s) { 
    std::stringstream ss(s); 

    std::cout << "Searching string: " << s << std::endl; 
    while (ss) { 

     while (ss && !isdigit(ss.peek())) 
      ss.get(); 

     if (! ss) 
      break; 

     int i = 0; 
     ss >> i; 
     std::cout << " Extraced value: " << i << std::endl; 

    } 
} 


int main() { 

    std::string s1 = "XDGHYH20YFYFFY"; 
    std::string s2 = "20YF35YFFY100"; 
    check (s1); 
    check (s2); 
    return 0; 
} 

产量:

Searching string: XDGHYH20YFYFFY 
    Extraced value: 20 
Searching string: 20YF35YFFY100 
    Extraced value: 20 
    Extraced value: 35 
    Extraced value: 100 

添加参数到check功能,限制接受的将是微不足道的结果。

相关问题