C ++如何用字母和数字拆分字符串

C++ how to split string with alphabets and numbers

我需要将以下字符串拆分成相应的字母和数字

CH1000003
ABC000123
WXYZ10001

我想要的结果是

st1: CH
st2: 1000003

st1: ABC
st2: 000123

st1: WXYZ
st2: 10001

现在我有了一个可以工作的代码,但是我写的代码量似乎有点太多了。必须有一个简单的方法。也许以某种方式在 C++ 中使用正则表达式?建议?

我的代码:

    std::string idToCheckStr="CH1000003";

    //find length of string
    int strLength = idToCheckStr.length();
    cout << "idToCheckStr: " << idToCheckStr <<endl;
    cout << "strLength   : " << strLength <<endl;

    string::iterator it;
    int index = 0;
    for ( it = idToCheckStr.begin() ; it < idToCheckStr.end(); it++ ,index++)
    {   
        //check where the numbers start in the string
        if (std::isdigit(*it) != 0)
        {
            cout<< "FOUND NUMBER!" <<endl;
            cout<< index << ": " << *it <<endl;
            break;
        }
            
         cout<< index << ": " << *it <<endl;
    }
    
    std::string firstPartStr = idToCheckStr.substr (0,index);
    cout << "firstPartStr: " << firstPartStr <<endl;
    
    std::string secondPartStr = idToCheckStr.substr (index,strLength);
    cout << "secondPartStr: " << secondPartStr <<endl;

OUTPUT:
idToCheckStr: CH1000003
strLength   : 9
0: C
1: H
FOUND NUMBER!
2: 1
firstPartStr: CH
secondPartStr: 1000003

感谢 igor。

    size_t first_digit = idToCheckStr.find_first_of("0123456789");
    cout << "first_digit: " << first_digit <<endl;
    
    std::string str1 = idToCheckStr.substr (0,first_digit);
    cout << "str1: " << str1 <<endl;
    
    std::string str2 = idToCheckStr.substr (first_digit,idToCheckStr.length());
    cout << "str2: " << str2 <<endl;

OUTPUT:
first_digit: 2
str1: CH
str2: 1000003

这是处理您的问题的一种简单方法。 我觉得这对你来说更容易理解。

    string s = "CH1000003";
    // cin >> s; if you waant to read the input
    
    string st1 = "", st2 = "";
    for(auto ch : s) {
        if(isdigit(ch)) st2 += ch;
        else if(isalpha(ch)) st1 += ch;
        else {} // if you want something else
    }
    
    cout << "st1: " << st1 << endl;
    cout << "st2: " << st2 << endl;

您确实可以为此使用正则表达式:

  • 模式为 ([A-Z]+)([0-9]+),即 1 个或多个大写字母的任意组合后跟 1 个或多个数字的任意组合。括号允许您捕获这 2 个组以便稍后访问它们。
  • std::regex_match(line, matches, pattern) 获取输入 line,并尝试将其与 pattern 匹配。如果可以,将匹配项存储在 std::smatch 数组中;其中第一个条目始终是整个匹配项,而后续条目则用于每个捕获组。如果不能,它只是 returns false.
  • 是否需要放宽正则表达式,例如在输入字符串之前、之后或中间允许空格,只需更改模式即可轻松完成:\s*([A-Z]+)\s*([0-9]+)\s*.

[Demo]

#include <fmt/core.h>
#include <iostream>  // cout
#include <regex>  // regex_match, smatch
#include <string>

int main() {
    std::string line{};
    std::regex pattern{R"(([A-Z]+)([0-9]+))"};
    while (std::getline(std::cin, line)) {
        std::smatch matches{};
        if (std::regex_match(line, matches, pattern)) {
            std::cout << fmt::format("line = '{}', alphabets = '{}', numbers = '{}'\n",
                matches[0].str(), matches[1].str(), matches[2].str());
        }
    }
}

// Outputs:
//
//   line = 'CH1000003', alphabets = 'CH', numbers = '1000003'
//   line = 'ABC000123', alphabets = 'ABC', numbers = '000123'
//   line = 'WXYZ10001', alphabets = 'WXYZ', numbers = '10001'