2016-08-22 3 views
1

続いSUBSTRING:消去は、次のように私はいくつかの文字列を持っている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; 
} 

しかし、上記の両方の方法で、文字だけまたは数字を削除します私は文字列の最初の部分を取得し、文字列の後ろに数字や文字を削除したいと思います。これを行う方がどちらの方が良いでしょうか?

+1

正規表現 - https://ideone.com/DHItCG、またはhttps://ideone.com/dXH0Yq –

+0

@WiktorStribiżew、この正規表現は、このようなThird3やSixth2のように文字列では動作しません。これらの文字列の場合でも、私はそれぞれ第三と第六を得ることができるはずです。 – smyslov

+0

@smyslov、WiktorStribiżewのソリューションは完全に動作します:https://ideone.com/e8jpB7 – rainer

答えて

2

++ - CLIのことができます。単純な^[A-Za-z]+正規表現を使用して、文字列の先頭にある1つ以上の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 
4

EDIT:質問が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 
Cで
+0

is_digit_or_underline関数は文字列またはcharを受け入れますか? – smyslov

+0

コードを見てください: 'char'をとります。 'find_if'は、関数がtrueを返す最初の要素(この場合は' char')のすべてのコンテナ(この場合は文字列)を検索します。 – rainer

+0

上記のコードを使用すると、find_ifでis_digit_or_underlineが呼び出された場所で次のエラーが発生します。 'メンバへのポインタがマネージクラスに対して無効です' – smyslov

1
for (int i = 0; i < str.size(); i++) 
{ 
    if (!std::isalpha(str[i])) 
    { 
     str.erase(i, str.size() - i); 
     break; 
    } 
} 
関連する問題