对于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
进行添加。逃脱字符的空间。