对于Delphi XE4,请尝试以下代码:

procedure TForm3.Button1Click(Sender: TObject);
var
  myStr: string;
begin
  Edit1.Text := TPerlRegEx.EscapeRegExChars('test');
end;


结果(Edit1.Text)为空。

这是一个错误还是我缺少了什么?我以前在regular-expressions.info pre-DelphiXE中的版本中使用此TPerlRegEx.EscapeRegExChars函数没有问题。

更新2:只是升级了用D2010编写的应用程序并遇到了此错误,但是只是想知道这样一个明显的错误会持续这么长的时间...现在我正在认真考虑使我的代码与Free Pascal兼容,但是我真的很喜欢反义词方法...

更新1:我正在使用Delphi XE4更新1。

最佳答案

它似乎是一个错误。如果是这样,XE4和XE5版本都包含它。我已经打开QC report来报告XE4..XE6。

问题似乎出在函数的最后一行:

Result.Create(Tmp, 0, J);


逐步进入调试器显示Tmp(一个TCharArray)在该点正确包含't','e','s','t', #0, #0, #0, #0,但是当函数实际返回时Result包含'',因为在该行之后的end;上设置了一个断点指示结果在该点(以及函数返回时)包含''

在类帮助器中提供一个替换版本,并进行较小的更改以实际存储从调用Create返回的值可解决此问题:

type
  TPerlRegExHelper = class helper for TPerlRegEx
  public
    class function EscapeRegExCharsEx(const S: string): string; static;
  end;

class function TPerlRegExHelper.EscapeRegExCharsEx(const S: string): string;
var
  I, J: Integer;
  Tmp: TCharArray;
begin
  SetLength(Tmp, S.Length * 2);
  J := 0;
  for I := Low(S) to High(S) do
  begin
    case S[I] of
      '.', '[', ']', '(', ')', '?', '*', '+', '{', '}', '^', '$', '|', '\':
        begin
          Tmp[J] := '\';
          Inc(j);
          Tmp[J] := S[I];
        end;
      #0:
        begin
          Tmp[J] := '\';
          Inc(j);
          Tmp[J] := '0';
        end;
      else
        Tmp[J] := S[I];
    end;
    Inc(J);
  end;
  { Result.Create(Tmp, 0, J); }  // The problem code from the original
  Result := String.Create(Tmp, 0, J);
end;


XE3(和您提到的开放源代码版本)完全不同地实现了逻辑,使用Result的更标准操作,从函数的第一行开始使用Result := S;,然后根据需要使用System.Insert进行添加。逃脱字符的空间。

10-08 15:52