unit DelimiterCut; //////////////////////////////////////////////////////////// //区切り文字取得 //00/07/24 //////////////////////////////////////////////////////////// interface uses SysUtils; //=が区切り文字だとして function DelimiterRight(Delimiter, Str: String): String; // AAA=BBB=CCC → CCC function DelimiterLeft(Delimiter, Str: String): String; // AAA=BBB=CCC → AAA function DelimiterLeftLong(Delimiter, Str: String): String; // AAA=BBB=CCC → AAA=BBB function DelimiterRightLong(Delimiter, Str: String): String; // AAA=BBB=CCC → BBB=CCC //という値を取得出来ます。 {──────────────────── 内部でAnsiPosかBackAnsiPosを使っているので すべての関数は2バイト文字に対応しています。 Delimiterが2バイト文字でも何文字あっても大丈夫 もちろん『=』が1つでも3つ以上でも ちゃんとLeftとRightで動作します。 ────────────────────} function BackAnsiPos(const SubStr,S: String): Integer; implementation //------------------------------- //文字列の後方検索2バイト対応版 function BackAnsiPos(const SubStr,S: String): Integer; var SearchStr: String; BackPosIndex: Integer; MbcsFlag: TMbcsByteType; begin Result := 0; MbcsFlag := mbSingleByte; {意味のない初期化} if AnsiPos(subStr,S)=0 then exit; SearchStr := S; while AnsiPos(subStr,SearchStr)<>0 do begin BackPosIndex := AnsiPos(subStr,SearchStr); MbcsFlag := ByteType(SearchStr, BackPosIndex); case MbcsFlag of mbSingleByte: { 半角 } Delete(SearchStr,1,BackPosIndex); mbLeadByte: { 全角の1バイト目 } Delete(SearchStr,1,BackPosIndex +1 ); mbTrailByte: { 全角の2バイト目 } Delete(SearchStr,1,BackPosIndex); end; end; //while case MbcsFlag of mbSingleByte: Result := length(S)-Length(SearchStr); mbLeadByte: Result := length(S)-Length(SearchStr) - 1; mbTrailByte: Result := length(S)-Length(SearchStr); end; end; //最も後方に位置する区切り文字(文字列)で指定した物の後方文字列を取得 function DelimiterRight(Delimiter, Str: String): String; var DelIndex: Integer; begin Result := Str; DelIndex := BackAnsiPos(Delimiter, Str); if DelIndex = 0 then exit; DelIndex := DelIndex + Length(Delimiter) - 1; Delete( Result, 1, DelIndex); end; //最も前方に位置する区切り文字(文字列)で指定した物の前方文字列を取得 function DelimiterLeft(Delimiter, Str: String): String; var DelIndex: Integer; begin Result := Str; DelIndex := AnsiPos( Delimiter, Str); if DelIndex = 0 then exit; Result := copy( Result, 1, DelIndex - 1); end; //最も後方に位置する区切り文字(文字列)で指定した物の前方方文字列を取得 function DelimiterLeftLong(Delimiter, Str: String): String; var DelIndex: Integer; begin Result := Str; DelIndex := BackAnsiPos(Delimiter, Str); if DelIndex = 0 then exit; Result := copy(Result, 1, DelIndex - 1); end; //最も前方に位置する区切り文字(文字列)で指定した物の後方文字列を取得 function DelimiterRightLong(Delimiter, Str: String): String; var DelIndex: Integer; begin Result := Str; DelIndex := AnsiPos( Delimiter, Str); if DelIndex = 0 then exit; Delete( Result, 1, DelIndex + Length(Delimiter) - 1); end; end.