using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.IO; namespace System { public static class StringExtension { //https://stackoverflow.com/questions/5617320/given-full-path-check-if-path-is-subdirectory-of-some-other-path-or-otherwise/31941159 /// /// Returns true if starts with the path . /// The comparison is case-insensitive, handles / and \ slashes as folder separators and /// only matches if the base dir folder name is matched exactly ("c:\foobar\file.txt" is not a sub path of "c:\foo"). /// public static bool IsSubPathOf(this string path, string baseDirPath) { string normalizedPath = Path.GetFullPath(path.Replace('/', '\\') .WithEnding("\\")); string normalizedBaseDirPath = Path.GetFullPath(baseDirPath.Replace('/', '\\') .WithEnding("\\")); return normalizedPath.StartsWith(normalizedBaseDirPath, StringComparison.OrdinalIgnoreCase); } public static string GetLast(this string source, int tail_length) { if (tail_length >= source.Length) return source; return source.Substring(source.Length - tail_length); } public static string RemoveNumbersAtEnd(this string str) { Regex rgx = new Regex(@"\d+$"); return rgx.Replace(str, string.Empty); } /// /// Returns with the minimal concatenation of (starting from end) that /// results in satisfying .EndsWith(ending). /// /// "hel".WithEnding("llo") returns "hello", which is the result of "hel" + "lo". public static string WithEnding( this string str, string ending) { if (str == null) return ending; string result = str; // Right() is 1-indexed, so include these cases // * Append no characters // * Append up to N characters, where N is ending length for (int i = 0; i <= ending.Length; i++) { string tmp = result + ending.Right(i); if (tmp.EndsWith(ending)) return tmp; } return result; } /// Gets the rightmost characters from a string. /// The string to retrieve the substring from. /// The number of characters to retrieve. /// The substring. public static string Right( this string value, int length) { if (value == null) { throw new ArgumentNullException("value"); } if (length < 0) { throw new ArgumentOutOfRangeException("length", length, "Length is less than zero"); } return (length < value.Length) ? value.Substring(value.Length - length) : value; } public static string Strip(this string value) { return value.Replace(" ", string.Empty); } public static string Repeat(this string value, int count) { return new StringBuilder(value.Length * count).Insert(0, value, count).ToString(); } public static unsafe string TruncateAndFill(this string s, int length, char fillChar) { char* buffer = stackalloc char[length]; int i; int min = Math.Min(s.Length, length); for (i = 0; i < min; i++) buffer[i] = s[i]; while (i < length) buffer[i++] = fillChar; return new string(buffer, 0, length); } public static String ToFixedString(this String value, int length, char appendChar = ' ') { int currlen = value.Length; int needed = length == currlen ? 0 : (length - currlen); return needed == 0 ? value : (needed > 0 ? value + new string(' ', needed) : new string(new string(value.ToCharArray().Reverse().ToArray()). Substring(needed * -1, value.Length - (needed * -1)).ToCharArray().Reverse().ToArray())); } } }