Delphi 正则表达式替换不一致行为

x4shl7ld  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(156)

我有下面的代码。

var
  result := 'DECLARE''' + #13#10 + 'DECLARE''''';
  result := TRegEx.Replace(result, '\A\s*DECLARE''\s*', 'abc', [roIgnoreCase]);
  ShowMessage(result);

当我运行它时,我得到:

这是预期的结果。但是,当我将替换字符串更改为空字符串时,如下所示:

result := 'DECLARE''' + #13#10 + 'DECLARE''''';
  result := TRegEx.Replace(result, '\A\s*DECLARE''\s*', '', [roIgnoreCase]);

  ShowMessage(result);

我在运行程序时得到了这样的结果:

为什么会这样呢?我只想替换第一个匹配项,这就是为什么我使用\A将正则表达式锚定在字符串的开头。

v7pvogib

v7pvogib1#

之所以会得到这样的结果,是因为TRegEx.Replace将Input字符串中的所有匹配项替换为Replacement字符串。
如果您只想替换第一个匹配项,则需要使用TRegEx.Replace的重载版本,该版本还允许您传递Count参数,使用该参数可以控制要替换的匹配项的数量。
由于TRegEx.Replace的此重载版本被声明为属于TRegEx记录的常规函数,而不是class function,因此您必须首先声明TRegEx记录的变量,并使用TRegEx.Create设置模式和选项,然后调用Replace的相应重载版本。
因此,您的代码应该如下所示:

var RegEx: TRegEx;

result := 'DECLARE''' + #13#10 + 'DECLARE''''';
RegEx := TRegEx.Create('\A\s*DECLARE''\s*', [roIgnoreCase]);
Result := RegEx.Replace(Result,'abc',1);
ShowMessage(result);

result := 'DECLARE''' + #13#10 + 'DECLARE''''';
RegEx := TRegEx.Create('\A\s*DECLARE''\s*', [roIgnoreCase]);
Result := RegEx.Replace(Result,'',1);
ShowMessage(result);

然后,对于abc替换字符串返回abcDECLARE'',对于空替换字符串返回DECLARE''

相关问题