在C ++ CLI中擦除子字符串后跟一个数字或字符

时间:2016-08-22 08:41:29

标签: string 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;
}

但是上述两种方法,只删除字符或数字但我想获取字符串的第一部分并删除字符串后跟数字或字符。这样做会更好吗?

3 个答案:

答案 0 :(得分:4)

编辑:问题被重新标记为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

答案 1 :(得分:2)

在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

答案 2 :(得分:1)

for (int i = 0; i < str.size(); i++)
{
    if (!std::isalpha(str[i]))
    {
        str.erase(i, str.size() - i);
        break;
    }
}