我尝试使用TPerlRegEx类用新行替换空格.
with RegExp do
begin
Subject:=Memo1.Lines.Text;
RegEx:=' ';
Replacement:='\r\n';
ReplaceAll;
Memo1.Lines.Text:=Subject;
end;
Run Code Online (Sandbox Code Playgroud)
问题是它将\ r \n替换视为文字文本.
使用 #13#10
program Project29;
{$APPTYPE CONSOLE}
uses
SysUtils, PerlRegEx;
var RegEx: TPerlRegEx;
function CStyleEscapes(const InputText:string):string;
var i,j: Integer;
begin
SetLength(Result, Length(InputText));
i := 1; // input cursor
j := 1; // output cursor
while i <= Length(InputText) do
if InputText[i] = '\' then
if i = Length(InputText) then
begin
// Eroneous quotation...
Result[j] := '\';
Inc(i);
Inc(j);
end
else
begin
case InputText[i+1] of
'r', 'R': Result[j] := #13;
'n', 'N': Result[j] := #10;
't', 'T': Result[j] := #9;
'\':
begin
Result[j] := '\';
Inc(j);
Result[j] := '\';
end;
else
begin
Result[j] := '\';
Inc(j);
Result[j] := InputText[i+1];
end;
end;
Inc(i,2);
Inc(j);
end
else
begin
Result[j] := InputText[i];
Inc(i);
Inc(j);
end;
SetLength(Result, j-1);
end;
begin
RegEx := TPerlRegEx.Create;
try
RegEx.RegEx := ' ';
RegEx.Replacement := CStyleEscapes('\t\t\t');;
RegEx.Subject := 'FirstLine SecondLine';
RegEx.ReplaceAll;
WriteLn(RegEx.Subject);
ReadLn;
finally RegEx.Free;
end;
end.
Run Code Online (Sandbox Code Playgroud)
我真的很想知道它为什么不按预期进行匹配.
\在Replacement文本中执行转义序列的处理TPerlRegEx.ComputeReplacement.如果您查看代码,您会发现没有产生回车符和换行符的序列.事实上ComputeReplacement,所有关于背面参考.
正则表达式的匹配阶段的处理由PCRE代码执行.但是,替换阶段是纯粹的Pascal代码.并且很容易检查代码以查看它的作用.它并没有按照你的想法去做,也不希望它做到.
结论是您无法使用转义序列指定所需的字符.我认为你需要设计自己的规则来转义不可打印的字符,并在OnReplace事件处理程序中应用这些规则.
| 归档时间: |
|
| 查看次数: |
3956 次 |
| 最近记录: |