1 // ================================================================================================
3 // 文字列処理に関するユーティリティクラスソース。</summary>
5 // <copyright file="StringUtils.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Utilities
14 using System.Text.RegularExpressions;
17 /// 文字列処理に関するユーティリティクラスです。
19 /// <remarks>一部メソッドは、Apache Commons Lang の StringUtils やJava標準の String を参考にしています。</remarks>
20 public static class StringUtils
25 /// <see cref="FormatDollarVariable"/>で使用する正規表現。
27 private static readonly Regex DollarVariableRegex = new Regex("\\$([0-9]+)");
34 /// 渡された文字列をチェックし、<c>null</c>だった場合には空の文字列を返します。
35 /// それ以外の場合には渡された文字列を返します。
37 /// <param name="str">チェックを行う対象となる文字列。</param>
38 /// <returns>渡された文字列、<c>null</c>の場合には空の文字列。</returns>
39 public static string DefaultString(string str)
41 return StringUtils.DefaultString(str, String.Empty);
45 /// 渡された文字列をチェックし、<c>null</c>だった場合には指定されたデフォルトの文字列を返します。
46 /// それ以外の場合には渡された文字列を返します。
48 /// <param name="str">チェックを行う対象となる文字列。</param>
49 /// <param name="defaultString">渡された文字列が<c>null</c>の場合に返されるデフォルトの文字列。</param>
50 /// <returns>渡された文字列、<c>null</c>の場合にはデフォルトの文字列。</returns>
51 public static string DefaultString(string str, string defaultString)
66 /// 指定された文字列の部分文字列を例外を発生させることなく取得します。
68 /// <param name="str">部分文字列の取得対象となる文字列。</param>
69 /// <param name="startIndex">部分文字列の開始位置。</param>
70 /// <returns>開始位置からの部分文字列。</returns>
71 public static string Substring(string str, int startIndex)
73 return StringUtils.Substring(str, startIndex, Int32.MaxValue);
77 /// 指定された文字列の部分文字列を例外を発生させることなく取得します。
79 /// <param name="str">部分文字列の取得対象となる文字列。</param>
80 /// <param name="startIndex">部分文字列の開始位置。</param>
81 /// <param name="length">部分文字列の文字数。</param>
82 /// <returns>開始位置から指定された文字数の部分文字列。文字数が足りない場合、最後まで。</returns>
83 public static string Substring(string str, int startIndex, int length)
90 int i = startIndex > 0 ? startIndex : 0;
96 int l = length > 0 ? length : 0;
97 if (l > str.Length - i)
102 return str.Substring(i, l);
110 /// この文字列の指定されたインデックス以降の部分文字列が、指定された接頭辞で始まるかどうかを判定します。
112 /// <param name="str">チェックを行う対象となる文字列。</param>
113 /// <param name="prefix">接頭辞。</param>
114 /// <param name="toffset">この文字列の比較を開始する位置。</param>
115 /// <returns>始まる場合<c>true</c>。<c>toffset</c>が負の値の場合、<c>str</c>の長さより大きい場合<c>false</c>。それ以外で<c>prefix</c>が空の場合は<c>true</c>。</returns>
116 /// <remarks>引数の<c>null</c>は許容、<c>str</c>のみまたは<c>prefix</c>のみ<c>null</c>は<c>false</c>、<c>prefix</c>も<c>null</c>は<c>true</c>を返す。</remarks>
117 public static bool StartsWith(string str, string prefix, int toffset)
122 return prefix == null;
124 else if (prefix == null)
130 if (toffset < 0 || toffset >= str.Length)
136 if (prefix.Length == 0)
141 // substringしてしまうと遅いので、先頭1文字だけは自前でチェック
142 if (str[toffset] != prefix[0])
148 return str.Substring(toffset).StartsWith(prefix);
156 /// 指定した文字列の書式項目を、指定した配列内の対応するオブジェクトの文字列形式に置換します。
158 /// <param name="format">$1~$数値の形式でパラメータを指定する書式指定文字列。</param>
159 /// <param name="args">書式設定対象オブジェクト。</param>
160 /// <returns>書式項目が <para>args</para> の対応するオブジェクトの文字列形式に置換された <para>format</para> のコピー。</returns>
161 /// <exception cref="ArgumentNullException"><para>format</para>または<para>args</para>が<c>null</c>の場合。</exception>
162 /// <remarks>.netではなくPerl等で見かける$~形式のフォーマットを行う。</remarks>
163 public static string FormatDollarVariable(string format, params object[] args)
166 Validate.NotNull(format);
167 Validate.NotNull(args);
169 // 正規表現で$1~$数値のパラメータ部分を抜き出し、対応するパラメータに置き換える
170 // 対応するパラメータが存在しない場合、空文字列となる
171 return DollarVariableRegex.Replace(
176 int index = Int32.Parse(match.Groups[1].Value) - 1;
177 return args.Length > index ? ObjectUtils.ToString(args[index]) : String.Empty;