c++ builder XE4, 10.2 Tokyo > 自動付加された数値のsuffix (例 "_123") を取得する実装


動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)

http://qiita.com/7of9/items/29f5393b523bdc9a30ba
の問題の対応

Unit1.cpp
#include <IdGlobal.hpp> // IsNumeric();
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String work1 = L"AAA_BBB_CCC_123";
    String suffix1 = getAutoAddedNumberSuffix(work1); // "_123";

    String work2 = L"AAA_BBB_CCC";
    String suffix2 = getAutoAddedNumberSuffix(work2); // L""

    String work3 = L"AAA_BBB_CCC_NAN";
    String suffix3 = getAutoAddedNumberSuffix(work3); // L""

    String work4 = L"AAA_BBB_CCC_";
    String suffix4 = getAutoAddedNumberSuffix(work4); // L""

    String work5 = L"AAA_BBB_CCC_1A3";
    String suffix5 = getAutoAddedNumberSuffix(work5); // L""

    String work6 = L"AAA_BBB_CCC_31415";
    String suffix6 = getAutoAddedNumberSuffix(work6); // L"_31415"

    String work7 = L"AAA_BBB_CCC_3141592";
    String suffix7 = getAutoAddedNumberSuffix(work7); // L""
}
//---------------------------------------------------------------------------

String __fastcall TForm1::getAutoAddedNumberSuffix(String srcStr)
{
    // 5桁までしか対応していない
    // _が複数入っている文字列に対応

    int len = srcStr.Length();
    static const int kToTheLast = MAXINT;
    String work = srcStr.SubString(len - 5, kToTheLast);    // 5:5桁まで

    int posUnderbar = work.Pos(L"_");
    if (posUnderbar == 0) {
        return L"";
    }

    String suffixNoUnderbar = work.SubString(posUnderbar + 1, kToTheLast);
    if (IsNumeric(suffixNoUnderbar)) {
        return L"_" + suffixNoUnderbar;
    }

    return L"";
}

getAutoAddedNumberSuffix()を使って、自動付加されたsuffixを見つける。
5桁数値のサフィックスまで対応 (インスタンスを5桁分作るということはないだろう。2桁は必要)。

取得したsuffixを使ってStringReplaceで取り除けばいい。

Unit2.cpp
    String numberSuffix = getAutoAddedNumberSuffix(this->Name); // 自動付加されるもの。例 L"_2"
    String nameNoSuffix = StringReplace(this->Name, numberSuffix, L"", TReplaceFlags()<<rfReplaceAll);