如何在电子邮件地址中的单词 "com" 前添加一个点?

How add a dot before of word "com" in a email address?

所以,

我有一个包含多个电子邮件地址的大型 txt 文件,有些电子邮件地址在单词 "com" 之前没有点,现在我想在保存到文件之前将此字符串添加到所有无效的电子邮件地址中。

例如,一些电子邮件地址采用这种格式:

aaglt_assessoria@yahoocom.br

正确的方法应该是:

aaglt_assessoria@yahoo.com.br

以及我如何保存这些电子邮件的代码:

function ExtractEmails(const Input: String; out Emails: TStringList): Boolean;
var
  I, position : Integer;
  Buffer : String;
  Tokens : TStringList;
begin
  Result := False;
  Tokens := TStringList.Create;
  Emails := TStringList.Create;
  Try
    Tokens.Delimiter := #32;
    Tokens.DelimitedText := Input;
    For I := 0 To Tokens.Count - 1 Do
      begin
      Buffer := Tokens.Strings[I];
      If Length(Buffer) < 5 Then Continue;
      If (Pos('@',Buffer) > 1) And
         (Pos('.',Buffer) > 3) And
         (Pos('.',Buffer) < Length(Buffer)) Then
         begin

          Emails.Add(Buffer);
      end;
    end;
    Result := True;
  Finally
    Tokens.Free;
  end;
end;

procedure EscreveEmails;
 var
 Linhas,Emails:TStringList;
 arq: TextFile;
begin
 Linhas := TStringList.Create;
 Emails := TStringList.Create;
 try
   Linhas.LoadFromFile('foo.txt');
   AssignFile(arq, 'new.txt');
   Rewrite(arq);
      If ExtractEmails(Linhas.Text,Emails) Then
       begin
        Writeln(arq,Emails.Text);
       end;
 finally
   CloseFile(arq);
   Linhas.Free;
   Emails.Free;
 end;
end;

我会说首先测试一下电子邮件地址是否是有效的电子邮件地址

function MailURLMayBeInvalid(const s: string): Boolean;
var
  i: Integer;
  c: string;
begin // ' ', ä, ö, ü, ß, [, ], (, ), : in EMail-Address
  Result := (Trim(s) = '') or (Pos(' ', AnsiLowerCase(s)) > 0) or
    (Pos('ä', AnsiLowerCase(s)) > 0) or (Pos('ö', AnsiLowerCase(s)) > 0) or
    (Pos('ü', AnsiLowerCase(s)) > 0) or (Pos('ß', AnsiLowerCase(s)) > 0) or
    (Pos('[', AnsiLowerCase(s)) > 0) or (Pos(']', AnsiLowerCase(s)) > 0) or
    (Pos('(', AnsiLowerCase(s)) > 0) or (Pos(')', AnsiLowerCase(s)) > 0) or
    (Pos(':', AnsiLowerCase(s)) > 0);
  if Result then Exit; // @ not in EMail-Address;
  i      := Pos('@', s);
  Result := (i = 0) or (i = 1) or (i = Length(s));
  if Result then Exit;
  Result := (Pos('@', Copy(s, i + 1, Length(s) - 1)) > 0);
  if Result then Exit; // Domain <= 1
  c      := Copy(s, i + 1, Length(s));
  Result := Length(c) <= 1;
  if Result then Exit;
  i      := Pos('.', c);
  Result := (i = 0) or (i = 1) or (i = Length(c));
end;

如果它不是有效地址,那么您可以简单地检查字符串中最后一次出现的 com,您可以使用 LastDelimiter 函数执行此操作此函数应该可以解决问题

function returnAddress(Address: String): String;
begin
    insert('.', Address, LastDelimiter('com',Address)-2);
    Result := Address;
end;

也许您可以使用正则表达式。我不是正则表达式破解者,但这是我带来的:

https://regex101.com/r/kX8yQ4/2

uses
  System.RegularExpressions;

function repairMailDot(const email: string): string; inline;
   begin
    result := TRegEx.Replace(email, '(@.*(?<!\.))(com(?:$|\..+))', '.', [roIgnoreCase])
   end;

procedure TForm1.FormCreate(Sender: TObject);
   begin
    ShowMessage(repairMailDot('aaglt_assessoria@yahoocom.br'));
    ShowMessage(repairMailDot('aaglt_assessoria@yahoo.com.br'));
    ShowMessage(repairMailDot('aaglt_assessoria@yahoocom'));
    ShowMessage(repairMailDot('aaglt_assessoria@yahoo.com'));
   end;