随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万


TRegExOption = (
  roNone,              //无
  roIgnoreCase,        //不区分大小写
  roMultiLine,         //多行模式; 可使 ^ 和 $ 匹配每个行首或行尾
  roExplicitCapture,   //只捕获指定了名称或编号的子表达式
  roCompiled,          //预编译表达式; 这在反复使用更有效率
  roSingleLine,        //单行模式; 使 . 也可匹配换行符
  roIgnorePatternSpace //忽略注释和未经转义的空白
);


uses RegularExpressions;

{roIgnoreCase}
procedure TForm1.Button1Click(Sender: TObject);
const
  pattern = '[A-Z]+\d+';
  txt = 'AAA1 bbb2 aa11 bb22 A111 B222 AAAA';
var
  match: TMatch;
begin
  Memo1.Clear;
  for match in TRegEx.Matches(txt, pattern, [roIgnoreCase]) do
  begin
    Memo1.Lines.Add(match.Value);
  end;

  Memo1.Lines.Add('----------');

  for match in TRegEx.Matches(txt, pattern) do
  begin
    Memo1.Lines.Add(match.Value);
  end;
end;
{*********************
AAA1
bbb2
aa11
bb22
A111
B222
----------
AAA1
A111
B222
**********************}

{roMultiLine}
procedure TForm1.Button2Click(Sender: TObject);
const
  txt = 'Delphi Delphi Delphi'#13#10'Delphi Delphi Delphi';
var
  rStr: string;
begin
  Memo1.Clear;
  {行首}
  rStr := TRegEx.Replace(txt, '^Delphi', '......', [roMultiLine]);
  Memo1.Lines.Add(rStr);
  Memo1.Lines.Add('--------------------');
  rStr := TRegEx.Replace(txt, '^Delphi', '......');
  Memo1.Lines.Add(rStr);

  Memo1.Lines.Add('--------------------');
  {行尾}
  rStr := TRegEx.Replace(txt, 'Delphi$', '......', [roMultiLine]);
  Memo1.Lines.Add(rStr);
  Memo1.Lines.Add('--------------------');
  rStr := TRegEx.Replace(txt, 'Delphi$', '......');
  Memo1.Lines.Add(rStr);
end;
{*********************
...... Delphi Delphi
...... Delphi Delphi
--------------------
...... Delphi Delphi
Delphi Delphi Delphi
--------------------
Delphi Delphi ......
Delphi Delphi ......
--------------------
Delphi Delphi Delphi
Delphi Delphi ......
**********************}

{roExplicitCapture}
procedure TForm1.Button3Click(Sender: TObject);
const
  pattern1 = '([A-Z]+)(\d+)';
  pattern2 = '(?<name1>[A-Z]+)(\d+)';
  pattern3 = '([A-Z]+)(?<3>\d+)';
  txt = 'AA11 BB22';
var
  match: TMatch;
  group: TGroup;
begin
  Memo1.Clear;

  for match in TRegEx.Matches(txt, pattern1, [roExplicitCapture]) do 
  begin
    for group in match.Groups do
    begin
      Memo1.Lines.Add(group.Value);
    end;
  end;
  Memo1.Lines.Add('--------------------');

  for match in TRegEx.Matches(txt, pattern1) do //此处把 pattern1 换做 pattern2 或 pattern3 均可
  begin
    for group in match.Groups do
    begin
      Memo1.Lines.Add(group.Value);
    end;
  end;
  Memo1.Lines.Add('--------------------');
  
  for match in TRegEx.Matches(txt, pattern2, [roExplicitCapture]) do 
  begin
    for group in match.Groups do
    begin
      Memo1.Lines.Add(group.Value);
    end;
  end;
  Memo1.Lines.Add('--------------------');
  
  for match in TRegEx.Matches(txt, pattern3, [roExplicitCapture]) do 
  begin
    for group in match.Groups do
    begin
      Memo1.Lines.Add(group.Value);
    end;
  end;
end;
{*********************
AA11
BB22
--------------------
AA11
AA
11
BB22
BB
22
--------------------
AA11
AA
BB22
BB
--------------------
AA11
11
BB22
22
**********************}

{roCompiled}
procedure TForm1.Button4Click(Sender: TObject);
var
  reg: TRegEx;
begin
  reg := TRegEx.Create('\d+', [roCompiled]);
  Memo1.Text := reg.Replace('AA11 BB22', '..');  //AA.. BB..
end;

{roSingleLine}
procedure TForm1.Button5Click(Sender: TObject);
const           
  pattern = '[A-Z]{1}.{1}';
  txt = 'A B C D'#13#10'A B C D'#13#10'A B C D';
var
  rStr: string;
begin
  Memo1.Clear;
  rStr := TRegEx.Replace(txt, pattern, '11', [roSingleLine]);
  Memo1.Lines.Add(rStr);
  Memo1.Lines.Add('--------------------');
  
  rStr := TRegEx.Replace(txt, pattern, '11');
  Memo1.Lines.Add(rStr);
end;
{*********************
11111111
11111111
111111D
--------------------
111111D
111111D
111111D
**********************}

{roIgnorePatternSpace}
procedure TForm1.Button6Click(Sender: TObject);
var
  rStr: string;
begin
  Memo1.Clear;
  {忽略空白}                                
  rStr := TRegEx.Replace('ABC,A B C,AB C', 'AB C', '...', [roIgnorePatternSpace]);
  Memo1.Lines.Add(rStr); //...,A B C,AB C
  rStr := TRegEx.Replace('ABC,A B C,AB C', 'AB C', '...');
  Memo1.Lines.Add(rStr); //ABC,A B C,...
  Memo1.Lines.Add('--------------------');

  {使用注释}
  rStr := TRegEx.Replace('ABC123', 'ABC#*123', '...', [roIgnorePatternSpace]);
  Memo1.Lines.Add(rStr); //...123
  rStr := TRegEx.Replace('ABC123', 'ABC#*123', '...');
  Memo1.Lines.Add(rStr); //...
end;
{*********************
...,A B C,AB C
ABC,A B C,...
--------------------
...123
...
**********************}

{选项集合}
procedure TForm1.Button7Click(Sender: TObject);
const
  pattern = '^Delphi';
  txt = 'DELPHI DELPHI DELPHI'#13#10'delphi delphi delphi';
begin
  Memo1.Text := TRegEx.Replace(txt, pattern, '......', [roIgnoreCase, roMultiLine]);
end;
{*********************
...... DELPHI DELPHI
...... delphi delphi
**********************}

posted on   万一  阅读(6017)  评论(4编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2008-03-29 System.SetString - 获取字符串
2008-03-29 System.Val - 将字符串转换为数字
2008-03-29 System.Str - 将数字格式化为字符串
2008-03-29 System.FillChar - 填充字节
2008-03-29 System.StringOfChar - 反复字符
2008-03-29 System.Pos - 搜索子串的位置
2008-03-29 System.Concat - 连接字符串


点击右上角即可分享
微信分享提示