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*
.
#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'
我需要将以下字符串拆分成相应的字母和数字
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
数组中;其中第一个条目始终是整个匹配项,而后续条目则用于每个捕获组。如果不能,它只是 returnsfalse
.- 是否需要放宽正则表达式,例如在输入字符串之前、之后或中间允许空格,只需更改模式即可轻松完成:
\s*([A-Z]+)\s*([0-9]+)\s*
.
#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'