You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求匹配类JS语法JSON读取型$P{xxx}占位符的正则表达式(Delphi)

正则表达式匹配$P{xxx}格式占位符(Delphi)

我刚好帮你整理了符合需求的正则表达式,完全适配你提到的$P{xxx}格式占位符,既能完整匹配整个占位符,还能对大括号内的点分隔路径项进行处理,同时兼容数组下标语法:

\$P\{((?:\w+(?:\[\d+\])?(?:\.\w+(?:\[\d+\])?)*))\}

正则表达式拆解

  • \$P\{:精准匹配占位符的固定开头$P{,其中$和{是正则特殊字符,必须用反斜杠转义
  • ((?:...)):最外层的捕获组,用来提取大括号内的完整路径表达式(比如DATA.Customers[2].Name)
  • (?:\w+(?:\[\d+\])?(?:\.\w+(?:\[\d+\])?)*):非捕获组,用来匹配类JavaScript的JSON读取路径:
    • \w+:匹配合法的变量名(比如DATA、Customers、Name)
    • (?:\[\d+\])?:可选的数组下标部分,支持[0]、[2]这类格式,用非捕获组避免生成多余的分组
    • (?:\.\w+(?:\[\d+\])?)*:匹配后续的点+变量名/数组下标组合,*表示可以有0个或多个这样的层级

分组说明

  • 整个正则会完整匹配$P{xxx}格式的占位符(比如$P{DATA.Customers[2].Name})
  • 大括号内的完整路径会被捕获到第1个分组中
  • 如果需要把每个点分隔的路径项单独拆分(比如DATA、Customers[2]、Name),可以用正则\w+(?:\[\d+\])?对第1分组的内容进行二次拆分

Delphi 代码示例

下面是用Delphi的TRegEx类实现匹配和分组提取的示例:

uses
  System.RegularExpressions, System.Classes;

procedure ExtractPPlaceholders(const AText: string);
var
  LRegEx: TRegEx;
  LMatch: TMatch;
  LPathItems: TStringList;
begin
  // 初始化正则表达式
  LRegEx := TRegEx.Create('\$P\{((?:\w+(?:\[\d+\])?(?:\.\w+(?:\[\d+\])?)*))\}', [roIgnoreCase]);
  LMatch := LRegEx.Match(AText);
  
  while LMatch.Success do
  begin
    // 输出完整匹配的占位符
    Writeln('完整占位符: ', LMatch.Value);
    // 输出大括号内的路径表达式
    Writeln('路径表达式: ', LMatch.Groups[1].Value);
    
    // 拆分路径中的每个项
    LPathItems := TStringList.Create;
    try
      TRegEx.Split(LMatch.Groups[1].Value, '\.', LPathItems);
      Writeln('拆分后的路径项:');
      for var LItem in LPathItems do
        Writeln('  - ', LItem);
    finally
      LPathItems.Free;
    end;
    
    Writeln('------------------------');
    // 匹配下一个占位符
    LMatch := LMatch.NextMatch;
  end;
end;

// 调用示例
ExtractPPlaceholders('示例文本:$P{DATA}、$P{DATA.Customers}、$P{DATA.Customers[2].Name}');

输出结果

运行上述代码后,会得到类似这样的输出:

完整占位符: $P{DATA}
路径表达式: DATA
拆分后的路径项:
  - DATA
------------------------
完整占位符: $P{DATA.Customers}
路径表达式: DATA.Customers
拆分后的路径项:
  - DATA
  - Customers
------------------------
完整占位符: $P{DATA.Customers[2].Name}
路径表达式: DATA.Customers[2].Name
拆分后的路径项:
  - DATA
  - Customers[2]
  - Name

内容的提问来源于stack exchange,提问作者Vlad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:30:35