如何使用 Delphi TRegEx 替换特定的捕获组?
How to Use Delphi TRegEx to replace a particular capture group?
我正在尝试在 Delphi XE7 中使用 TRegex 进行搜索并替换字符串。
字符串看起来像这样“@FXXX(b, v,”,我想替换第二个整数值 v。
例如:
@F037(594,2027,-99,-99,0,0,0,0)
可能会成为
@F037(594,弗雷德,-99,-99,0,0,0,0)
我是 RegEx 的新手,但编造了这个模式,它似乎可以很好地找到匹配项并为“2027”(下面括号中的部分)识别正确的捕获组。这是:
@F\d{3}(\s*\d{1,5}\s*,\s*(\d{1,5})\s*,
我的问题是我不知道如何使用 Delphi TRegEx 实现仅替换捕获的组“2027”。我对 TMatch 和 TGroup 以及如何使用它们感到相当困惑。谁能推荐一些示例代码?我还怀疑我不理解反向引用的概念。
这是我目前的情况:
Uses
RegularExpressions;
//The function that does the actual replacement
function TForm6.DoReplace(const Match: TMatch): string;
begin
//This causes the whole match to be replaced.
//@F037(594,2027,-99,-99,0,0,0,0) becomes Fred-99,-99,0,0,0,0)
//How to just replace the first matched group (ie 2027)?
If Match.Success then
Result := 'Fred';
end;
//Code to set off the regex replacement based on source text in Edit1 and put the result back into Memo1
//Edit1.text set to @F037(594,2027,-99,-99,0,0,0,0)
procedure TForm6.Button1Click(Sender: TObject);
var
regex: TRegEx;
Pattern: string;
Evaluator: TMatchEvaluator;
begin
Memo1.Clear;
Pattern := '@F\d{3}\(\s*\d{1,5}\s*,\s*(\d{1,5})\s*,';
RegEx.Create(Pattern);
Evaluator := DoReplace;
Memo1.Lines.Add(RegEx.Replace(Edit1.Text, Pattern, Evaluator));
end;
使用正则表达式替换时,将替换所有匹配的内容。您可以访问整个比赛、捕获的组和命名的捕获组。
在 Delphi 中有两种不同的方法可以做到这一点。
您当前正在使用一个 Evaluator,这是一个对象方法,其中包含要替换的内容的说明。在此方法中,您可以访问整个匹配内容。结果将是替换字符串。
如果原版正则表达式无法执行您想在替换中执行的操作(例如增加数字、更改字符大小写)
,则此方法很有用
还有另一种使用字符串作为替换的重载 Replace 方法。由于您想在此处进行基本的正则表达式替换,因此我建议您使用它。
在此字符串中,您可以反向引用匹配的模式([=12=]
用于整个匹配,$Number
用于捕获组,${Name}
用于命名捕获组),但也可以添加您想要的任何字符。
因此您可以捕获所有想要保留在组中的内容,然后按照 Wiktors 评论中的建议进行反向引用。
当您进行单个替换时,我还建议使用 class 函数 TRegex.Replace 而不是创建正则表达式然后替换。
Memo1.Lines.Add(
TRegex.Replace(
Edit1.Text,
'(@F\d{3}\(\s*\d{1,5}\s*,\s*)\d{1,5}(\s*,)',
'Fred'));
PCRE 正则表达式还支持 \K
(忽略之前匹配的所有内容)和前瞻,可用于准确捕获您要替换的内容,例如
Memo1.Lines.Add(
TRegex.Replace(
Edit1.Text,
'@F\d{3}\(\s*\d{1,5}\s*,\s*\K\d{1,5}(?=\s*,)',
'Fred'));
我正在尝试在 Delphi XE7 中使用 TRegex 进行搜索并替换字符串。
字符串看起来像这样“@FXXX(b, v,”,我想替换第二个整数值 v。 例如: @F037(594,2027,-99,-99,0,0,0,0)
可能会成为 @F037(594,弗雷德,-99,-99,0,0,0,0)
我是 RegEx 的新手,但编造了这个模式,它似乎可以很好地找到匹配项并为“2027”(下面括号中的部分)识别正确的捕获组。这是:
@F\d{3}(\s*\d{1,5}\s*,\s*(\d{1,5})\s*,
我的问题是我不知道如何使用 Delphi TRegEx 实现仅替换捕获的组“2027”。我对 TMatch 和 TGroup 以及如何使用它们感到相当困惑。谁能推荐一些示例代码?我还怀疑我不理解反向引用的概念。
这是我目前的情况:
Uses
RegularExpressions;
//The function that does the actual replacement
function TForm6.DoReplace(const Match: TMatch): string;
begin
//This causes the whole match to be replaced.
//@F037(594,2027,-99,-99,0,0,0,0) becomes Fred-99,-99,0,0,0,0)
//How to just replace the first matched group (ie 2027)?
If Match.Success then
Result := 'Fred';
end;
//Code to set off the regex replacement based on source text in Edit1 and put the result back into Memo1
//Edit1.text set to @F037(594,2027,-99,-99,0,0,0,0)
procedure TForm6.Button1Click(Sender: TObject);
var
regex: TRegEx;
Pattern: string;
Evaluator: TMatchEvaluator;
begin
Memo1.Clear;
Pattern := '@F\d{3}\(\s*\d{1,5}\s*,\s*(\d{1,5})\s*,';
RegEx.Create(Pattern);
Evaluator := DoReplace;
Memo1.Lines.Add(RegEx.Replace(Edit1.Text, Pattern, Evaluator));
end;
使用正则表达式替换时,将替换所有匹配的内容。您可以访问整个比赛、捕获的组和命名的捕获组。
在 Delphi 中有两种不同的方法可以做到这一点。
您当前正在使用一个 Evaluator,这是一个对象方法,其中包含要替换的内容的说明。在此方法中,您可以访问整个匹配内容。结果将是替换字符串。 如果原版正则表达式无法执行您想在替换中执行的操作(例如增加数字、更改字符大小写)
,则此方法很有用还有另一种使用字符串作为替换的重载 Replace 方法。由于您想在此处进行基本的正则表达式替换,因此我建议您使用它。
在此字符串中,您可以反向引用匹配的模式([=12=]
用于整个匹配,$Number
用于捕获组,${Name}
用于命名捕获组),但也可以添加您想要的任何字符。
因此您可以捕获所有想要保留在组中的内容,然后按照 Wiktors 评论中的建议进行反向引用。 当您进行单个替换时,我还建议使用 class 函数 TRegex.Replace 而不是创建正则表达式然后替换。
Memo1.Lines.Add(
TRegex.Replace(
Edit1.Text,
'(@F\d{3}\(\s*\d{1,5}\s*,\s*)\d{1,5}(\s*,)',
'Fred'));
PCRE 正则表达式还支持 \K
(忽略之前匹配的所有内容)和前瞻,可用于准确捕获您要替换的内容,例如
Memo1.Lines.Add(
TRegex.Replace(
Edit1.Text,
'@F\d{3}\(\s*\d{1,5}\s*,\s*\K\d{1,5}(?=\s*,)',
'Fred'));