SJString クラス

このクラスは文字列や管理機能を提供します。UNICODE 対応です。文字列の分割や抽出、消去、置換、検索、その他の文字列操作が可能です。JavaScript のString に似せてつくりました。
更新日 2014-07-29

仕様

UNICODE 対応の文字列管理クラスです。文字列の分割や抽出、消去、置換、検索、その他の文字列操作が可能です。内部的にはUNICODE で実装 されているので、UNICODE ビルド時のパフォーマンスは高いです。もちろんMBCS 環境でも不自由なく動作します。IE でJavaScript を触った事の ある人ならすぐに使えます。

ソースコード

sjstring.h 右クリックで「対象をファイルに保存」でダウンロードしてください。

メソッド

各種エフェクトメソッドがありますが、変換結果を別のインスタンスとして返す為 オリジナルインスタンスは変化しません。また文字を指定する際には先頭からの位置(文字数)で扱います。MBCS 環境でも バイト単位ではありませんのでご注意下さい。

operator =

代入演算子です。char、UNICODE 文字(列) を代入できます。
SJString str = __TEXT("あいうえお");
str = L"かきくけこ";

operator const char*(), wchar_t*()

キャスト演算子によって、文字列ポインタとしても扱えます。
SJString str = "Hello World!";
SetWindowText(hWnd, str);

operator +=

文字列を追加できます。
SJString str = "ABC";
str += L"XYZ";
// str == "ABCXYZ"

operator ==, !=

文字列同士を比較できます。
SJString strA = "ABC";
if (strA == "ABC")
{
	// もちろん結果は真
}

operator*, operator*=

文字列を指定回数連結して返します。
SJString str = "[ABC]";
str *= 3;
// str == "[ABC][ABC][ABC]"

length(), getByteLength()

文字数ならびにMBCS 文字列時のバイト数を返します。
SJString str = "aiueoあいうえお";
int n = str.length();
// n == 10

n = str.getByteLength();
// n = 15;

indexOf(), lastIndexOf()

検索を行い、その文字位置を返します。lastIndexOf() は後ろから探します。検索開始位置や 発見回数を指定できます。なお見つからなければ-1 を返します。
SJString str = "あいうえお...あいうえお";
int n = str.indexOf("え");
// n == 3

n = str.lastIndexOf("あ");
// n == 8
注)バイト位置ではなく、先頭をゼロとする文字数位置を返します。

getDifferentPos()

指定の文字と違う文字が見つかった場所を返します。
SJString str = "     A";
int n = str.getDifferentPos(" ");
// n == 5

indexOfChar()

指定の文字列に合致する文字が見つかった位置を返します。
SJString str = "ABC:EFG"
int n = str.indexOfChar("/?:-");
// n == 3

substring()

指定範囲の文字列を返します。開始位置と終了位置で指定します。
SJString str = "私の名前は[AST]です。"
str = str.substring( str.indexOf("[")+1, str.lastIndexOf("]"));
// str == AST

charAt()

指定した位置の文字1個を返します。
SJString str = "あいうえお";
str = str.charAt(1);
// str == "い"

erase()

指定範囲の文字列を削除します。
SJString str = "[あいうえお,かきくけこ]";
str = str.erase(1, str.length()-1);
// str == []

isAlphabet()

文字列がアルファベットオンリーならTRUEを返します。
SJString str = "Which is the way to the antiqu shop?";
BOOL bRet = str.isAlphabet();
// bRet == TRUE

isOnlyNumber()

文字列が数値オンリーならTRUEを返します。
SJString str = "2005-12-25 12-10";
BOOL bRet = str.isOnlyNumber();
// bRet == TRUE

isExistChar()

文字列中に指定の文字が存在すればTRUE を返します。
SJString str = "あいうえお";
BOOL bRet = str.isExistChar("うUu");
// bRet == TRUE

isExistWithoutChar()

指定の文字列に含まれない文字があればTRUE を返します。
SJString str = "ABCD_あ_CD_AB";
BOOL bRet = str.isExistWithoutChar("ABCD_");
// bRet == TRUE

Replace(), ReplaceEx()

置換します。ReplaceEx() は第一引数に合致する文字から第二引数に合致する 文字の範囲を、別の文字列で置きかえます。
SJString str = "[あ]-[い]-[う]"
str = str.Replace("[", "(");
str = str.Replace("]", ")");
// str == "(あ)-(い)-(う)";

str = str.ReplaceEx( "(", ")", "X");
// str == "X-X-X"

Clip(), ClipEx()

指定した文字列を検索し、その前後に文字列を挿入します。ClipEx() では検索文字列を、先頭文字と終端文字で指定できます。
SJString str = "私の名前はRobert Parr です。";
str = str.Clip("Robert Parr", "[", "]");
// str == "私の名前は[Robert Parr] です。"

str = str.ClipEx("[", "]", "-=", "=-");
// str == "私の名前は-=[Robert Parr]=- です。"

copy()

文字列をコピーしたBSTR を返します。必要が無くなったら必ずSysFreeString() で解放してください!
SJString str = "This is Mr.Incredible.";
BSTR bstr = str.copy();
::SysFreeString(bstr);

parseInt()

文字列を数値に変換して返します。
SJString str = "901";
int n = str.parseInt();
// n == 901

Reverse()

文字列を前後反転します。
SJString str = "ABCDEF-Z";
str = str.Reverse();
// str = "Z-FEDCBA"

toLowerCase(), toUpperCase()

文字列中の全てのアルファベットを小文字(もしくは大文字)に変換します。
SJString str = "私の名前はRobert Parr です。";
str = str.toLowerCase();
// str == "私の名前はrobert parr です。"

str = str.toUpperCase();
// str == "私の名前はROBERT PARR です。"

TabSpread()

文字列中のタブをスペース(該当する個数)で置き換えます。
SJString str = "AA\t\tBB";
str = str.Tabspread(4);		// タブサイズをスペース4個分と考えた場合。
// str == "AA      BB"

serch()

指定した文字列の出現回数を返します。
SJString str = "aTa_aTa_aTa";
int n = str.serch( "T" );
// n == 3

setRetVal_BeCareFor()

SJString のoperator= では、デフォルトの動作で文字列のコピーを意味します。これは当然の動作です。ところがsetRetVal_BeCareFor() メソッドを実行すると、operator= においてコピーでは無く、(内部)メモリブロックの移譲が行われます。
SJString str = "ABC";
SJString strTmp = str;		// 通常のコピー
// strTmp == "ABC" and str == "ABC"

str.setRetVal_BeCareFor();
SJString strX = str;		// 内部メモリの管理者がstrX に移る
// strX == "ABC" and str == ""
この関数を通常は使う必要がありません。内部メモリブロックに作用する危険なメソッドであり、operator= が必ず直後に実行される ケースにおいてのみ使用できます。例えば関数の戻り値としてのケースです。
SJString GetText()
{
	SJString retVal;
	{
		retVal = "This is Mr.Incredible. I'm in.";
	}
	retVal.setRetVal_BeCareFor();
	return retVal;
}
この場合の変数retVal は関数を抜ける際にoperator= によるコピー対象になり、その後はスコープにより破棄されます。この状況では setRetVal_BeCareFor() を使っても差し支え無い状況です。メモリブロックそのものを渡すのですから、コピーにかかるオーバーヘッドを 大きく減らす効果があります。とくに再帰呼び出し時などに効果が出る事でしょう。