/// <summary> /// Извлекает подстроки из строки. Подстрока ищется между двумя заданными строками, начиная с заданной позиции. /// </summary> /// <param name="str">Строка, в которой будет поиск подстрок.</param> /// <param name="left">Строка, которая находится слева от искомой подстроки.</param> /// <param name="right">Строка, которая находится справа от искомой подстроки.</param> /// <param name="startIndex">Позиция, с которой начинается поиск подстрок. Отсчёт от 0.</param> /// <param name="comparsion">Одно из значений перечисления, определяющее правила поиска.</param> /// <returns>Найденые подстроки, иначе пустой массив строк.</returns> /// <exception cref="System.ArgumentNullException">Значение параметра <paramref name="left"/> или <paramref name="right"/> равно <see langword="null"/>.</exception> /// <exception cref="System.ArgumentException">Значение параметра <paramref name="left"/> или <paramref name="right"/> является пустой строкой.</exception> /// <exception cref="System.ArgumentOutOfRangeException"> /// Значение параметра <paramref name="startIndex"/> меньше 0. /// -или- /// Значение параметра <paramref name="startIndex"/> равно или больше длины строки <paramref name="str"/>. /// </exception> public static string[] Substrings(this string str, string left, string right, int startIndex, StringComparison comparsion = StringComparison.Ordinal) { if (string.IsNullOrEmpty(str)) { return(new string[0]); } #region Проверка параметров if (left == null) { throw new ArgumentNullException("left"); } if (left.Length == 0) { throw ExceptionHelper.EmptyString("left"); } if (right == null) { throw new ArgumentNullException("right"); } if (right.Length == 0) { throw ExceptionHelper.EmptyString("right"); } if (startIndex < 0) { throw ExceptionHelper.CanNotBeLess("startIndex", 0); } if (startIndex >= str.Length) { throw new ArgumentOutOfRangeException("startIndex", Resources.ArgumentOutOfRangeException_StringHelper_MoreLengthString); } #endregion int currentStartIndex = startIndex; List <string> strings = new List <string>(); while (true) { // Ищем начало позиции левой подстроки. int leftPosBegin = str.IndexOf(left, currentStartIndex, comparsion); if (leftPosBegin == -1) { break; } // Вычисляем конец позиции левой подстроки. int leftPosEnd = leftPosBegin + left.Length; // Ищем начало позиции правой строки. int rightPos = str.IndexOf(right, leftPosEnd, comparsion); if (rightPos == -1) { break; } // Вычисляем длину найденной подстроки. int length = rightPos - leftPosEnd; strings.Add(str.Substring(leftPosEnd, length)); // Вычисляем конец позиции правой подстроки. currentStartIndex = rightPos + right.Length; } return(strings.ToArray()); }
/// <summary> /// Создаёт соединение с сервером через прокси-сервер. /// </summary> /// <param name="destinationHost">Хост сервера, с которым нужно связаться через прокси-сервер.</param> /// <param name="destinationPort">Порт сервера, с которым нужно связаться через прокси-сервер.</param> /// <param name="tcpClient">Соединение, через которое нужно работать, или значение <see langword="null"/>.</param> /// <returns>Соединение с сервером через прокси-сервер.</returns> /// <exception cref="System.InvalidOperationException"> /// Значение свойства <see cref="Host"/> равно <see langword="null"/> или имеет нулевую длину. /// -или- /// Значение свойства <see cref="Port"/> меньше 1 или больше 65535. /// -или- /// Значение свойства <see cref="Username"/> имеет длину более 255 символов. /// -или- /// Значение свойства <see cref="Password"/> имеет длину более 255 символов. /// </exception> /// <exception cref="System.ArgumentNullException">Значение параметра <paramref name="destinationHost"/> равно <see langword="null"/>.</exception> /// <exception cref="System.ArgumentException">Значение параметра <paramref name="destinationHost"/> является пустой строкой.</exception> /// <exception cref="System.ArgumentOutOfRangeException">Значение параметра <paramref name="destinationPort"/> меньше 1 или больше 65535.</exception> /// <exception cref="xNet.Net.ProxyException">Ошибка при работе с прокси-сервером.</exception> /// <remarks>Если порт сервера неравен 80, то для подключения используется метод 'CONNECT'.</remarks> public override TcpClient CreateConnection(string destinationHost, int destinationPort, TcpClient tcpClient = null) { CheckState(); #region Проверка параметров if (destinationHost == null) { throw new ArgumentNullException("destinationHost"); } if (destinationHost.Length == 0) { throw ExceptionHelper.EmptyString("destinationHost"); } if (!ExceptionHelper.ValidateTcpPort(destinationPort)) { throw ExceptionHelper.WrongTcpPort("destinationPort"); } #endregion TcpClient curTcpClient = tcpClient; if (curTcpClient == null) { curTcpClient = CreateConnectionToProxy(); } if (destinationPort != 80) { HttpStatusCode statusCode = HttpStatusCode.OK; try { NetworkStream nStream = curTcpClient.GetStream(); SendConnectionCommand(nStream, destinationHost, destinationPort); statusCode = ReceiveResponse(nStream); } catch (Exception ex) { curTcpClient.Close(); if (ex is IOException || ex is SocketException) { throw NewProxyException("An error occurred while working with the proxy server '{0}'.", ex); } throw; } if (statusCode != HttpStatusCode.OK) { curTcpClient.Close(); throw new ProxyException(string.Format( "Received invalid status code '{0}' on '{1}' proxy.", statusCode, ToString()), this); } } return(curTcpClient); }
/// <summary> /// Извлекает последнею подстроку из строки. Подстрока ищется между двумя заданными строками, начиная с заданной позиции. /// </summary> /// <param name="str">Строка, в которой будет поиск последней подстроки.</param> /// <param name="left">Строка, которая находится слева от искомой подстроки.</param> /// <param name="right">Строка, которая находится справа от искомой подстроки.</param> /// <param name="startIndex">Позиция, с которой начинается поиск подстроки. Отсчёт от 0.</param> /// <param name="comparsion">Одно из значений перечисления, определяющее правила поиска.</param> /// <returns>Найденая подстрока, иначе пустая строка.</returns> /// <exception cref="System.ArgumentNullException">Значение параметра <paramref name="left"/> или <paramref name="right"/> равно <see langword="null"/>.</exception> /// <exception cref="System.ArgumentException">Значение параметра <paramref name="left"/> или <paramref name="right"/> является пустой строкой.</exception> /// <exception cref="System.ArgumentOutOfRangeException"> /// Значение параметра <paramref name="startIndex"/> меньше 0. /// -или- /// Значение параметра <paramref name="startIndex"/> равно или больше длины строки <paramref name="str"/>. /// </exception> public static string LastSubstring(this string str, string left, string right, int startIndex, StringComparison comparsion = StringComparison.Ordinal) { if (string.IsNullOrEmpty(str)) { return(string.Empty); } #region Проверка параметров if (left == null) { throw new ArgumentNullException("left"); } if (left.Length == 0) { throw ExceptionHelper.EmptyString("left"); } if (right == null) { throw new ArgumentNullException("right"); } if (right.Length == 0) { throw ExceptionHelper.EmptyString("right"); } if (startIndex < 0) { throw ExceptionHelper.CanNotBeLess("startIndex", 0); } if (startIndex >= str.Length) { throw new ArgumentOutOfRangeException("startIndex", Resources.ArgumentOutOfRangeException_StringHelper_MoreLengthString); } #endregion // Ищем начало позиции левой подстроки. int leftPosBegin = str.LastIndexOf(left, startIndex, comparsion); if (leftPosBegin == -1) { return(string.Empty); } // Вычисляем конец позиции левой подстроки. int leftPosEnd = leftPosBegin + left.Length; // Ищем начало позиции правой подстроки. int rightPos = str.IndexOf(right, leftPosEnd, comparsion); if (rightPos == -1) { if (leftPosBegin == 0) { return(string.Empty); } else { return(LastSubstring(str, left, right, leftPosBegin - 1, comparsion)); } } // Вычисляем длину найденной подстроки. int length = rightPos - leftPosEnd; return(str.Substring(leftPosEnd, length)); }