我发现了最新的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函数中的某个内部字段。