Delphi 10.1 - 调用TRegEx.Replace()

时间:2017-07-14 13:03:26

标签: regex delphi

我发现了最新的Delphi 10.1 Berlin(以及10.2东京)的一个错误。

如果您使用指定的TMatchEvaluator调用TRegEx.Replace,则可能在Evaluator函数内部出现错误的TMatch。在Delphi XE-XE5中看起来效果很好。

求值:

function TForm1.EvaluatorU(const Match: TMatch): string;
var
  lChar: Word;
  lMatchVal: string;
begin
  Result := '';
  lMatchVal := Match.Groups[1].Value;
  lChar := StrToIntDef('$'+lMatchVal, 0);
  if lChar <> 0 then
    Result := Char(lChar);
end;

呼叫:

Result := TRegEx.Replace('\u0418\u0443, \u0427\u0436\u044d\u0446\u0437\u044f\u043d', '\\u([0-9a-f]{4})', EvaluatorU, [roIgnoreCase]);

第一次调用Evaluator将带来正确的TMatch.Value(或TMatch.Group [] .Value)上下文,但第二次调用会给Match.Value带来错误的回调函数(

您对解决方法有一些了解吗?

我将在TPerlRegEx类上检查这个问题,也许在包装器(TRegEx)函数中出错了。

更新:使用TPerlRegEx替换回调函数(OnReplace)效果很好......

Update2:似乎TPerlRegEx中存在错误。它返回错误的GroupOffsets。在第一次调用OnReplace回调时,此值是正确的。下一次调用返回+1偏移量超过需要。但调用TPerlRegEx.Groups会返回正确的子组值...

找到上次更新和解决方案

我在TPerlRegEx.UTF8IndexToUnicode函数优化中发现了一个问题。 LastIndex * / LastIndexResult *字段用于优化具有相同参数的函数顺序调用。但是在通过回调函数进行替换之后以及当MatchAgain被调用到TPerlRegEx.ReplaceAll函数中时,这可能会成为一个坏技巧(

简单的解决方案是将System.RegularExpressionsCore.pas从\ source \ rtl \ common复制到您的项目目录,并将TPerlRegEx.UTF8IndexToUnicode的调用替换为不推荐的未优化的UTF8IndexToUnicode函数...或者清除ClearStoredGroups函数中的某个内部字段。

UPD 即可。 Here is my embarcadero quality central issue

0 个答案:

没有答案