检查字符串是否包含一系列数字

时间:2010-06-22 18:32:52

标签: c++ string

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

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
}

答案 2 :(得分:0)

如果要搜索范围内的所有数字,请在循环中使用string :: find函数。以下是该函数的参考:

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

您是否也想仅使用字符串中的数字一次?例如,如果在每次匹配后没有从字符串中删除它们,SDFSD256fdsfs将为您提供数字2 5 6 25 56 256。

答案 3 :(得分: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函数添加参数以限制接受的结果将是微不足道的。