在 C++ CLI 中擦除后跟数字或字符的子字符串
Erase substring followed by a digit or character in C++ CLI
我有几个字符串如下:
First_1
First_2
Second_2
Third3
Fourth_A4
Fifth3B
Sixth2
Seventh_2A
Eighth
从字符串中,我只需要得到下面的First
、Second
、Third
、Fourth
等等。也就是说,在出现下划线或数字时,忽略下划线或数字之后的其余字符串。
为了删除数字,我这样做了:
str.erase(std::remove_if(str.begin(), str.end(), std::isdigit), str.end());
对于角色,我这样做了:
std::string wService::removeCharacters(std::string str, char chars[])
{
for (unsigned int i = 0; i < strlen(chars); ++i)
{
str.erase(std::remove(str.begin(), str.end(), chars[i]), str.end());
}
return str;
}
但是以上两种方法,都只删除字符或数字,但我想获取字符串的第一部分并删除字符串后跟数字或字符。哪种方式更好?
编辑: 问题被重新标记为 C++-CLI;下面的代码适用于标准 C++。
您可以使用 std::find_if
找到第一个数字或下划线,然后从那里删除:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
bool is_digit_or_underline(char x) {
return std::isdigit(x) || (x == '_');
}
void remove_after_digit_or_underline(std::string &x) {
x.erase(std::find_if(x.begin(), x.end(), is_digit_or_underline), x.end());
}
int main() {
std::vector<std::string> v;
v.push_back("First_1");
v.push_back("First_2");
v.push_back("Second_2");
v.push_back("Third3");
v.push_back("Fourth_A4");
v.push_back("Fifth3B");
v.push_back("Sixth2");
v.push_back("Seventh_2A");
v.push_back("Eighth");
for (size_t i=0; i<v.size(); ++i) {
remove_after_digit_or_underline(v[i]);
std::cout << v[i] << std::endl;
}
return 0;
}
输出:
First
First
Second
Third
Fourth
Fifth
Sixth
Seventh
Eighth
for (int i = 0; i < str.size(); i++)
{
if (!std::isalpha(str[i]))
{
str.erase(i, str.size() - i);
break;
}
}
在 C++-CLI 中,您可以使用简单的 ^[A-Za-z]+
正则表达式来匹配字符串开头的任何一个或多个 ASCII 字母:
String ^ str = "Third3";
String ^ what = "^[A-Za-z]+";
String ^ result;
Regex ^ r = gcnew Regex(what, System::Text::RegularExpressions::RegexOptions::CultureInvariant);
result = r->Match(str)->Value;
Console::WriteLine(result); // => Third
我有几个字符串如下:
First_1
First_2
Second_2
Third3
Fourth_A4
Fifth3B
Sixth2
Seventh_2A
Eighth
从字符串中,我只需要得到下面的First
、Second
、Third
、Fourth
等等。也就是说,在出现下划线或数字时,忽略下划线或数字之后的其余字符串。
为了删除数字,我这样做了:
str.erase(std::remove_if(str.begin(), str.end(), std::isdigit), str.end());
对于角色,我这样做了:
std::string wService::removeCharacters(std::string str, char chars[])
{
for (unsigned int i = 0; i < strlen(chars); ++i)
{
str.erase(std::remove(str.begin(), str.end(), chars[i]), str.end());
}
return str;
}
但是以上两种方法,都只删除字符或数字,但我想获取字符串的第一部分并删除字符串后跟数字或字符。哪种方式更好?
编辑: 问题被重新标记为 C++-CLI;下面的代码适用于标准 C++。
您可以使用 std::find_if
找到第一个数字或下划线,然后从那里删除:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
bool is_digit_or_underline(char x) {
return std::isdigit(x) || (x == '_');
}
void remove_after_digit_or_underline(std::string &x) {
x.erase(std::find_if(x.begin(), x.end(), is_digit_or_underline), x.end());
}
int main() {
std::vector<std::string> v;
v.push_back("First_1");
v.push_back("First_2");
v.push_back("Second_2");
v.push_back("Third3");
v.push_back("Fourth_A4");
v.push_back("Fifth3B");
v.push_back("Sixth2");
v.push_back("Seventh_2A");
v.push_back("Eighth");
for (size_t i=0; i<v.size(); ++i) {
remove_after_digit_or_underline(v[i]);
std::cout << v[i] << std::endl;
}
return 0;
}
输出:
First
First
Second
Third
Fourth
Fifth
Sixth
Seventh
Eighth
for (int i = 0; i < str.size(); i++)
{
if (!std::isalpha(str[i]))
{
str.erase(i, str.size() - i);
break;
}
}
在 C++-CLI 中,您可以使用简单的 ^[A-Za-z]+
正则表达式来匹配字符串开头的任何一个或多个 ASCII 字母:
String ^ str = "Third3";
String ^ what = "^[A-Za-z]+";
String ^ result;
Regex ^ r = gcnew Regex(what, System::Text::RegularExpressions::RegexOptions::CultureInvariant);
result = r->Match(str)->Value;
Console::WriteLine(result); // => Third