求匹配类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
相关产品推荐
相关产品推荐

