/// <summary> /// Возвращает подстроку из входной строки, которая отчитывается от указанной позиции и до указанного вхожденя указанного токена. /// </summary> /// <param name="Input"></param> /// <param name="Token">Номер вхождения указанного токена, начиная с 1</param> /// <param name="Number"></param> /// <param name="StartPosition"></param> /// <param name="ComparisonType"></param> /// <returns></returns> public static String GetSubstringToTokenWithSpecifiedNumber(String Input, String Token, Byte Number, Int32 StartPosition, StringComparison ComparisonType) { if (Input.IsStringNullEmptyWhiteSpace() == true) { throw new ArgumentException("Входная строка не может быть NULL, пустой или состоящей из одних пробелов", "Input"); } if (Token.IsStringNullOrEmpty() == true) { throw new ArgumentException("Токен не может быть NULL или пустой строкой", "Token"); } if (Enum.IsDefined(ComparisonType.GetType(), ComparisonType) == false) { throw new InvalidEnumArgumentException("ComparisonType", (Int32)ComparisonType, ComparisonType.GetType()); } if (String.Compare(Input, Token, ComparisonType) == 0) { throw new ArgumentException("Входная строка не может быть равна токену"); } if (Input.Contains(Token, ComparisonType) == false) { return Input; } if (Number == 0) { throw new ArgumentOutOfRangeException("Number", "Номер вхождения указанного токена не может быть нулевой"); } if (StartPosition < 0) { throw new ArgumentOutOfRangeException("StartPosition", StartPosition, "Начальная позиция не может быть меньше 0"); } String sub = Input.Substring(StartPosition); Int32 nums_of_occureses = StringTools.StringAnalyzers.GetNumberOfOccurencesInString(sub, Token, ComparisonType); if (Number > nums_of_occureses) { throw new ArgumentOutOfRangeException("Number", "Указанная бозиция больше, чем количество вхождений токена в части строки"); } List<int> positions = StringTools.StringAnalyzers.GetPositionsOfTokenInString(sub, Token, ComparisonType); Int32 desired_position = positions[Number - 1]; return sub.Substring(0, desired_position); }
/// <summary> /// Возвращает исходную строку, в которой обрезана её часть от начала или от конца до ближайшего указанного токена /// </summary> /// <param name="Input">Входящая строка, из которой надо извлечь подстроку</param> /// <param name="Token">Токен, который определяет точку обрезания и также обрезается</param> /// <param name="LeaveToken">Если "true" - ближайший токен будет оставлен. Если "false" - он тоже будет удалён.</param> /// <param name="Dir">Направление, с которого будет обрезана подстрока: из начала или из конца</param> /// <param name="ComparisonType">Опции сравнения строк между собой</param> /// <returns></returns> public static String TruncateToClosestToken(String Input, String Token, Boolean LeaveToken, StringTools.Direction Dir, StringComparison ComparisonType) { if (Input.IsStringNullEmptyWhiteSpace() == true) { throw new ArgumentException("Входная строка не может быть NULL, пустой или состоящей из одних пробелов", "Input"); } if (Token.IsStringNullOrEmpty() == true) { throw new ArgumentException("Токен не может быть NULL или пустой строкой", "Token"); } if (Enum.IsDefined(ComparisonType.GetType(), ComparisonType) == false) { throw new InvalidEnumArgumentException("ComparisonType", (Int32)ComparisonType, ComparisonType.GetType()); } if (String.Compare(Input, Token, ComparisonType) == 0) { throw new ArgumentException("Входная строка не может быть равна токену"); } if (Input.Contains(Token, ComparisonType) == false) { return Input; } Int32 token_length = Token.Length; switch (Dir) { case StringTools.Direction.FromStartToEnd: Int32 index_of_first_token = Input.IndexOf(Token, ComparisonType); if (LeaveToken == true) { return Input.Remove(0, index_of_first_token); } else { return Input.Remove(0, index_of_first_token + token_length); } case StringTools.Direction.FromEndToStart: Int32 index_of_last_token = Input.LastIndexOf(Token, ComparisonType); if (LeaveToken == true) { return Input.Remove(index_of_last_token + token_length); } else { return Input.Remove(index_of_last_token); } default: throw new InvalidEnumArgumentException("Dir", (Int32)Dir, Dir.GetType()); } }
/// <summary> /// Возвращает подстроку из входной строки, которая отчитывается от начала или от конца и до указанного вхожденя указанного токена. /// </summary> /// <param name="Input"></param> /// <param name="Token"></param> /// <param name="Number">Номер вхождения указанного токена, начиная с 1</param> /// <param name="Dir"></param> /// <param name="ComparisonType"></param> /// <returns></returns> public static String GetSubstringToTokenWithSpecifiedNumber(String Input, String Token, Byte Number, StringTools.Direction Dir, StringComparison ComparisonType) { if (Input.IsStringNullEmptyWhiteSpace() == true) { throw new ArgumentException("Входная строка не может быть NULL, пустой или состоящей из одних пробелов", "Input"); } if (Token.IsStringNullOrEmpty() == true) { throw new ArgumentException("Токен не может быть NULL или пустой строкой", "Token"); } if (Enum.IsDefined(ComparisonType.GetType(), ComparisonType) == false) { throw new InvalidEnumArgumentException("ComparisonType", (Int32)ComparisonType, ComparisonType.GetType()); } if (String.Compare(Input, Token, ComparisonType) == 0) { throw new ArgumentException("Входная строка не может быть равна токену"); } if (Input.Contains(Token, ComparisonType) == false) { return Input; } if (Number == 0) { throw new ArgumentOutOfRangeException("Number", "Номер вхождения указанного токена не может быть нулевой"); } Int32 nums_of_occureses = StringTools.StringAnalyzers.GetNumberOfOccurencesInString(Input, Token, ComparisonType); if (Number > nums_of_occureses) { throw new ArgumentOutOfRangeException("Number", Number, "Указанная позиция больше, чем количество вхождений токена в строке"); } List<int> positions = StringTools.StringAnalyzers.GetPositionsOfTokenInString(Input, Token, ComparisonType); Int32 token_length = Token.Length; Int32 desired_position; switch (Dir) { case StringTools.Direction.FromStartToEnd: desired_position = positions[Number - 1]; return Input.Substring(0, desired_position); case StringTools.Direction.FromEndToStart: desired_position = positions[positions.Count - Number]; return Input.Substring(desired_position + token_length); default: throw new InvalidEnumArgumentException("Dir", (Int32)Dir, Dir.GetType()); } }