在 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

从字符串中,我只需要得到下面的FirstSecondThirdFourth等等。也就是说,在出现下划线或数字时,忽略下划线或数字之后的其余字符串。

为了删除数字,我这样做了:

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