如何在电子邮件地址中的单词 "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;
所以,
我有一个包含多个电子邮件地址的大型 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;