Как я могу отделить имя сервера от номера порта в строке? - PullRequest
4 голосов
/ 27 апреля 2011

Если есть строка почтового сервера, такая как smtp.gmail.com: 587 , как я могу проанализировать ее, чтобы сохранить «smtp.gmail.com» в строковой переменной и «587» в другой?

Ответы [ 4 ]

9 голосов
/ 27 апреля 2011
function SplitAtChar(const Str: string; const Chr: char;
  out Part1, Part2: string): boolean;
var
  ChrPos: integer;
begin
  result := true;
  ChrPos := Pos(Chr, Str);
  if ChrPos = 0 then
    Exit(false);
  Part1 := Copy(Str, 1, ChrPos - 1);
  Part2 := Copy(Str, ChrPos + 1, MaxInt);
end;

Пример использования:

var
  p1, p2: string;
begin
  if SplitAtChar('smtp.gmail.com:587', ':', p1, p2) then
  begin
    ShowMessage(p1);
    ShowMessage(p2);
  end;
4 голосов
/ 27 апреля 2011

Если вы используете Delphi XE и хотите использовать одну строку вместо регулярного выражения:

uses
  Types, StrUtils;
var
  StrArr: TStringDynArray;
begin
  StrArr := SplitString('smtp.gmail.com:587', ':');
  Assert(StrArr[0] = 'smtp.gmail.com');
  Assert(StrArr[1] = '587');
end.
3 голосов
/ 27 апреля 2011

Если вы используете Delphi XE, вы можете также использовать встроенную поддержку регулярных выражений:

uses RegularExpressions;

procedure parse(const pInput: string; var vHostname,
  vPortNumber: string);
var
  l_Regex: TRegEx;
  l_Match: TMatch;
begin
  l_Regex := TRegEx.Create('^([a-zA-Z0-9.]+)(:([0-9]+))?$');
  l_Match := l_RegEx.Match(pInput);
  if l_Match.Success then
  begin
    vHostname := l_Match.Groups[1].Value;
    if l_Match.Groups.Count > 3 then
      vPortNumber := l_Match.Groups[3].Value
    else
      vPortNumber := '25'; // default SMTP port
  end
  else
    begin
    vHostname := '';
    vPortNumber := '';
  end;
end;

Это будет соответствовать smtp.gmail.com:587, а также smtp.gmail.com (в последнем случае vPortNumber назначается стандартный порт SMTP 25).

1 голос
/ 28 апреля 2011

Класс Indy TIdURI может разбить любой URI на его части (протокол, хост, порт, пользователь, пароль, путь и т. Д.).Инди включена в Delphi.В TIDURI сообщалось о некоторых ошибках здесь и упомянутых здесь , которые планируется исправить в Indy 11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...