// ================================================================================================
//
// 文字列処理に関するユーティリティクラスソース。
//
//
// Copyright (C) 2012 Honeplus. All rights reserved.
//
// Honeplus
// ================================================================================================
namespace Honememo.Utilities
{
using System;
using System.Text.RegularExpressions;
///
/// 文字列処理に関するユーティリティクラスです。
///
/// 一部メソッドは、Apache Commons LangのStringUtilsやJava標準のStringを参考にしています。
public static class StringUtils
{
#region 定数
///
/// で使用する正規表現。
///
private static readonly Regex DollarVariableRegex = new Regex("\\$([0-9]+)");
#endregion
#region 初期化メソッド
///
/// 渡された文字列をチェックし、nullだった場合には空の文字列を返します。
/// それ以外の場合には渡された文字列を返します。
///
/// チェックを行う対象となる文字列。
/// 渡された文字列、nullの場合には空の文字列。
public static string DefaultString(string str)
{
return StringUtils.DefaultString(str, string.Empty);
}
///
/// 渡された文字列をチェックし、nullだった場合には指定されたデフォルトの文字列を返します。
/// それ以外の場合には渡された文字列を返します。
///
/// チェックを行う対象となる文字列。
/// 渡された文字列がnullの場合に返されるデフォルトの文字列。
/// 渡された文字列、nullの場合にはデフォルトの文字列。
public static string DefaultString(string str, string defaultString)
{
if (str == null)
{
return defaultString;
}
return str;
}
#endregion
#region 切り出しメソッド
///
/// 指定された文字列の部分文字列を例外を発生させることなく取得します。
///
/// 部分文字列の取得対象となる文字列。
/// 部分文字列の開始位置。
/// 開始位置からの部分文字列。
public static string Substring(string str, int startIndex)
{
return StringUtils.Substring(str, startIndex, int.MaxValue);
}
///
/// 指定された文字列の部分文字列を例外を発生させることなく取得します。
///
/// 部分文字列の取得対象となる文字列。
/// 部分文字列の開始位置。
/// 部分文字列の文字数。
/// 開始位置から指定された文字数の部分文字列。文字数が足りない場合、最後まで。
public static string Substring(string str, int startIndex, int length)
{
if (str == null)
{
return null;
}
int i = startIndex > 0 ? startIndex : 0;
if (i > str.Length)
{
return string.Empty;
}
int l = length > 0 ? length : 0;
if (l > str.Length - i)
{
l = str.Length - i;
}
return str.Substring(i, l);
}
#endregion
#region 文字列チェック
///
/// この文字列の指定されたインデックス以降の部分文字列が、指定された接頭辞で始まるかどうかを判定します。
///
/// チェックを行う対象となる文字列。
/// 接頭辞。
/// この文字列の比較を開始する位置。
/// 始まる場合true。が負の値の場合、の長さより大きい場合false。それ以外でが空の場合はtrue。
/// 引数のnullは許容、のみまたはのみnullはfalse、もnullはtrueを返す。
public static bool StartsWith(string str, string prefix, int toffset)
{
// nullチェック
if (str == null)
{
return prefix == null;
}
else if (prefix == null)
{
return false;
}
// 範囲チェック
if (toffset < 0 || toffset >= str.Length)
{
return false;
}
// 長さチェック
if (prefix.Length == 0)
{
return true;
}
// substringしてしまうと遅いので、先頭1文字だけは自前でチェック
if (str[toffset] != prefix[0])
{
return false;
}
// 後は普通のStartWithで処理
return str.Substring(toffset).StartsWith(prefix);
}
#endregion
#region 書式化メソッド
///
/// 指定した文字列の書式項目を、指定した配列内の対応するオブジェクトの文字列形式に置換します。
///
/// $1~$数値の形式でパラメータを指定する書式指定文字列。
/// 書式設定対象オブジェクト。
/// 書式項目がの対応するオブジェクトの文字列形式に置換されたのコピー。
/// またはがnullの場合。
/// .netではなくPerl等で見かける$~形式のフォーマットを行う。
public static string FormatDollarVariable(string format, params object[] args)
{
// nullチェック
Validate.NotNull(format, "format");
Validate.NotNull(args, "args");
// 正規表現で$1~$数値のパラメータ部分を抜き出し、対応するパラメータに置き換える
// 対応するパラメータが存在しない場合、空文字列となる
return DollarVariableRegex.Replace(
format,
(Match match)
=>
{
int index = int.Parse(match.Groups[1].Value) - 1;
return args.Length > index ? ObjectUtils.ToString(args[index]) : string.Empty;
});
}
#endregion
#region 比較メソッド
///
/// 指定した2つのStringオブジェクトを比較し、並べ替え順序におけるそれらの相対位置を示す整数を返します。
///
/// 比較対象の第1文字列。
/// 比較対象の第2文字列。
///
/// 0未満: がより小さい,
/// 0: とは等しい,
/// 0より大きい: がより大きい。
///
///
/// パラメータにはnullが指定可能です。nullまたは空文字列は最も大きい値とみなします。
/// nullと空文字列を比較した場合、nullを大きい値とみなします。
///
public static int CompareNullsLast(string strA, string strB)
{
// まずnullの判定
if (strA == null && strB == null)
{
return 0;
}
else if (strA == null)
{
return 1;
}
else if (strB == null)
{
return -1;
}
// 次に空文字列の判定(nullと空文字列は一応区別)
if (string.IsNullOrEmpty(strA) && string.IsNullOrEmpty(strB))
{
return 0;
}
else if (string.IsNullOrEmpty(strA))
{
return 1;
}
else if (string.IsNullOrEmpty(strB))
{
return -1;
}
// どちらもnull or 空で無い場合は普通に判定
return string.Compare(strA, strB);
}
#endregion
}
}